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;插入一个项目后
答案 0 :(得分:1)
我希望能力保持在1000。
尺寸从1000开始,因此容量必须至少为1001。
至于加倍,那是因为vector
是dynamic 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的向量。
另一方面,容量由向量自动处理,具体取决于实现方式。这样做的典型方法是在向量必须增长时将容量加倍,因此实际上,无论向量中有多少项,添加新元素的平均时间都保持不变。