欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++ vector用法

程序员文章站 2022-03-22 09:11:44
...

在C++中,vector是一个十分有用的容器,下面对这个容器做一下总结:

基本操作

(1)头文件#include<vector>
(2)创建vector对象:vector<int> vec;
(3)尾部插入数字:vec.push_back(a);
(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的;
(5)使用迭代器访问元素。

vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
	cout<<*it<<endl;

(6)插入元素:vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a。
(7)删除元素:vec.erase(vec.begin()+i);删除第i+1个元素。
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始。
(8)向量大小:vec.size();
(9)清空:vec.clear();

注意

vector的元素不仅仅可以是int,double,string,还可以是结构体。但是要注意:结构体要定义为全局的,否则会出错。

struct  Student   
{   
	int  a;   
}stu1;   //stu1是一个变量  
         //使用时可以直接访问stu1.a 

typedef  struct  Student2   
{   
   int  a;   
}stu2;  //stu2是一个结构体类型=struct Student2
        // stu2则必须先 stu2 s2; 然后 s2.a=10; 
#include<iostream>
#include<vector>
using namespace std;

typedef struct rect{
	int id;
	int length;
	int width;
	//对于向量元素是结构体,可在结构体内部定义比较函数
	//下面按照id,length,width升序排序
	bool operator<(const rect &a) const{
		if(id!=a.id)
			return id<a.id;
		else{
			if(length!=a.length)
				return length<a.length;
			else
				return width<a.width;
		}
	} 
	
}Rect;

int main(){
	vector<Rect> vec;
	Rect rect;
	rect.id=1;
	rect.length=2;
	rect.width=3;
	vec.push_back(rect);
	vector<Rect>::iterator it=vec.begin();
	cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;
	return 0;
}

算法

(1)使用reverse将元素翻转:需要头文件#include<algorithm>
reverse(vec.begin(),vec.end());
(2)使用sort排序:需要头文件#include<algorithm>
sort(vec.begin(),vec.end());默认排序是按升序排列,即从小到大。
可以通过重写排序比较函数按照降序比较,如下:
定义排序比较函数:

bool Comp(const int &a,const int &b){
        return a>b;
}
//调用时
sort(vec.begin(),vec.end(),Comp);
//这样就是降序排序

vector的内存释放

vector:C++ STL中的顺序容器,封装数组

vector容器中的内存自增长

与其他容器不同,其内存空间只会增长,不会减少。

为了支持快速的随机访问,vector容器的元素以连续方式存放,每个元素都紧挨着前一个元素存储。

设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其实际分配的容量要比当前所需的空间多一些。就是说,vector容器预留了一些额外的存储区,用于存放新添加的元素,这样就不必为每个新元素重新分配整个容器的内存空间。关于vector的内存空间,有两个函数需要注意:size()成员指当前拥有的元素个数;capacity()成员指当前(容器必须分配新存储空间之前)可以存储的元素个数。reserve()成员可以用来控制容器的预留空间。vector另外一个特性在于它的内存空间会自增长,每当vector容器不得不分配新的存储空间时,会以加倍当前容量的分配策略实现重新分配。例如,当前capacity为50,当添加第51个元素时,预留空间不够用了,vector容器会重新分配大小为100的内存空间,作为新连续存储的位置。

vector内存释放

由于vector的内存占用空间只增不减,比如你首先分配了10,000个字节,然后erase掉后面9,999个,留下一个有效元素,但是内存占用仍为10,000个。所有内存空间是在vector析构时候才能被系统回收。empty()用来检测容器是否为空的,clear()可以清空所有元素。但是即使clear(),vector所占用的内存空间依然如故,无法保证内存的回收。