C++ vector用法
在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所占用的内存空间依然如故,无法保证内存的回收。