使用vector需要包含头文件
#include <vector>
一、定义和初始化
vector<char> v0;
vector<char> v1(5);//初始化大小至少为5,实际capacity可能会稍大一点
vector<char> v1a(6,'x');//初始化大小为6,各元素初始值为'x'
vector<char> v2(v1a);//构造一个vector,其capacity==vla.size(),元素和v1a完全一样
char hello[]="Hello";
vector<char> v3(hello, hello+5);//hello+5指向需要拷贝的最后一个元素的下一个位置
vector<IP> v4(2);//会调用类IP的无参数构造函数来构造IP类型的对象 new IP()
二、遍历vector
接上面的定义。
for(vector<char>::iterator itr = v1.begin();itr!=v1.end(); itr++){
cout<< *itr;//输出是5个空格字符
}
for(int i = 0; i <v1.size(); i++){//循环0次,因为size为0
cout<< v1[i];
}
for(int i = 0; i <v2.size(); i++){
cout<< v2[i];//输出xxxxxx
}
for(int i = 0; i <v3.size(); i++){
cout<< v3[i];//输出Hello
}
cout <<v4[0].d1<<"."<<v4[0].d2<<"."<<v4[0].d3<<"."<<v4[0].d4;
//输出255.255.255.255,IP()中会赋值d1=d2=d3=d4=255
三、增加、赋/取值
vector<char> v0;
v0.push_back(‘a’);//增加元素到尾部,可能引起vector容量的增加
v0.push_back('b');
v0.push_back('c');
v0[2] = 'x';//若下标越界,则为抛出异常
cout <<v0[1] << v0.at(2);//若下标越界,则为抛出异常
char str[] = "1234";
v0.insert(v0.begin()+ 2, str, str + 4);//在v0[2]之前插入1234; v0 = ab1234x
v0.insert(v0.begin(),2, '1');//在v0[0]之前插入11;v0=11ab1234x
v0.insert(v0.begin(),'0'); //在v0[0]之之前插入0;v0=011ab1234x
四、删除
vector<char> v0;
v0.push_back('a');
v0.push_back('b');
v0.push_back('c');
v0.push_back('d');
v0.push_back('e');//v0=abcde
v0.pop_back();//删除最后一个元素,该函数没有返回值;v0=abcd
vector<char>::iterator itr0 = v0.begin() +1;
itr0 =v0.erase(itr0);//删除itr0指向元素,之后返回指向被删除元素下一位置,itr0变为无效迭代器,再使用则报vector iterators incompatible异常;v0 = acd
itr0 =v0.erase(itr0, v0.end()); //删除[itr0, end)之间的元素,之后返回指向被删除最后的元素下一位置,这里是end
v0.clear(); //清空所有元素
五、获取状态
vector<char> v0;
v0.push_back('a');
v0.push_back('b');
v0.push_back('c');
boolflag = v0.empty();//判断是否为空
int num = v0.size();//元素个数
intcapa = v0.capacity();//总容量大小,即可以放多少个元素
v0.resize(100);//改变size大小。若新容量值N<size(),原尾部size()-N个元素会被删除;否则,在尾部插入N-size()个用用无参构造函数构造的对象。
v0.reserve(100);//确保以后调用capacity时,返回值>=100
六、内存分配问题
1)保留内存
假定你想建立一个容纳1-1000值的vector<int>:
vector<int> v;
for (int i = 1; i <= 1000; ++i)
v.push_back(i);
在大多数STL实现中,这段代码在循环过程中将会导致2到10次重新分配。因为vector在重新分配发生时一般把容量翻倍。所以,这种做法的开销很大。
当可预先估计所需容量时,可以为vector保留足够大小的容量,以免重新分配带来的开销。可以这样做:
vector<int>v(1000);
for(int i = 1; i <= 1000; ++i) v.push_back(i);
或者
vector<int>v;
v.reserve(1000);//保留1000个元素的存储空间
for(int i = 1; i <= 1000; ++i) v.push_back(i);
第一种方法直接在构造时就保留了至少1000个存储单元,第二种方法会引起1次内存重新分配,因为建议用第一种方法。
2)收缩内存
如果需要收缩vector v的内存到恰好足够实际元素存放的大小,可调用
vector<int>(v).swap(v);
该语句首先构造一个临时的vector对象,该对象的capacity大小,只够存放v的所有元素,并且元素与v相同。然后,将临时对象和v的存储进行交换。之时,v就没有多余的存储空间了。语句执行完后,临时对象被释放。该语句的执行需要一定的时间开销。
3)完全释放内存
vector<int>v;
…
v.clear();//capacity不变,size变成0
vector<int>().swap(v);//capacity变成0
七、地址失效问题
v.insert(itr,‘2’);
v.erase(itr);
insert和erase发生位置之后的迭代器均会失效,在上面的例子中,原来指向itr之后元素的迭代器均会失效。