vector是类模板,某种程度上可以看做是数组的升级版,但创建后仍可以改变大小。甚至《C++ primer(第4版)》中还有这样子的说法:“从技术上说,在原来为空的vector容器上n次调用push_back函数,从而创建拥有n个元素的vector容器,其执行时间永远不能超过n的常量倍。”
大家也可能都知道,vector会为可能添加的元素预留空间,但是预留空间总会进行么?今天做了一个测试,跟大家分享一下结果。
1、初始化时是不会多分分配内存的。此时size()恒等于capacity()。原因是也许根本就没有增加元素的需求,多分配内存纯粹是浪费。
2、首次调用push_back()后,因为没有多余的空间存放添加的元素,此时将内存加倍。具体来说,若添加之前的size()等于n,则调用push_back()后,capacity()变成2n。
3、以后再调用push_back(),若空间够用,则直接添加,当不够用时,再次加倍空间。
3、调用insert()情况类似,但注意确保迭代器有效。
测试代码如下:
#include #include using namespace std; using std::vector; int main() { vector ivec; vector ivec1(3); cout<<"empty vector"<<endl; cout<<"size:"<<ivec.size()<<endl; cout<<"capacity:"<<ivec.capacity()<<endl; cout<<"non-empty vector"<<endl; cout<<"size:"<<ivec1.size()<<endl; cout<<"capacity:"<<ivec1.capacity()<<endl; cout<<"****push_back()*****"<<endl; for (int i=1;i!=20;i++) { ivec.push_back(i); cout<<i<<"\t"<<"size:"<<ivec.size()<<"\t" <<"capacity:"<<ivec.capacity()<<endl; } cout<<"****insert()*****"<<endl; vector::iterator iter=ivec1.begin(); for(vector::size_type j=0;j!=20;j++) { ivec1.insert(iter,j); cout<<j<<"\t"<<"size:"<<ivec1.size()<<"\t" <<"capacity:"<<ivec1.capacity()<<endl; iter=ivec1.begin(); } return 0; }