插入第一个对象后,STL向量的1000初始大小的容量加倍

时间:2011-09-20 11:22:52

标签: stl vector

STL向量的容量因无(明显)原因而翻倍。

我创建一个初始大小为1000的向量,插入一个项目。我希望能力保持在1000.

vector <int> vec(1000);

cout << "vector capacity " << (unsigned int)vec.capacity() << endl;
vec.push_back(11);

cout << "vector capacity " << (unsigned int)vec.capacity() << endl;

输出是: 载体容量1000

矢量容量2000 - &gt;插入一个项目后

3 个答案:

答案 0 :(得分:1)

  

我希望能力保持在1000。

尺寸从1000开始,因此容量必须至少为1001。

至于加倍,那是因为vectordynamic array,每次size() > capacity()的威胁弹出时,容量加倍,确保你得到摊销O(1) push_back。引用维基百科:

  

当插入 n 元素时,容量形成几何级数。以任何恒定比例扩展数组可确保插入 n 元素总体上需要O( n )时间,这意味着每次插入都需要按照摊销的常量时间进行。此比例 a 的值导致时空权衡:每次插入操作的平均时间约为 a /( a -1) ,浪费的细胞数量超过( a -1) n

答案 1 :(得分:1)

std :: vector的构造函数创建一个向量,其中1000个元素使用默认值初始化,在本例中为0.它不会创建一个空的向量,其中包含以后要追加的1000个元素的空间。

然后你添加一个额外的元素,因此向量的size()现在是1001.因为它需要重新分配,它将分配的容量加倍,以便分摊后面的push_back()。

答案 2 :(得分:0)

首先,不要混淆size()capacity()

  • size()为您提供了向量包含的元素数量。
  • capacity()给出当前保留的内存槽数(向量保留的内存中有多少个元素)。容量总是等于或大于容量。

现在,vector<int> vec(1000);会创建大小 1000的向量,因此添加一个元素会为您提供大小为1001的向量。

另一方面,容量由向量自动处理,具体取决于实现方式。这样做的典型方法是在向量​​必须增长时将容量加倍,因此实际上,无论向量中有多少项,添加新元素的平均时间都保持不变。