【发布时间】:2018-01-06 06:26:13
【问题描述】:
根据以下测试,std::vector<int> 似乎是通过这种方式增加容量的:
发生在我们
push_back()并且容量已经满(即v.size() == v.capacity())的时候,需要注意一点之前不会发生 p>容量增加到之前容量的1.5倍
问题:为什么是这个 1.5 系数?它依赖于实现吗?是最优的吗?
另外,有没有办法在这段代码中分析重新分配的确切时间? (有时可能不需要移动数组的第一部分就可以增加容量)
vector<int> v;
int previouscapacity = 0;
for (unsigned int i = 0; i < 1000000; i++)
{
v.push_back(i);
if (v.capacity() != previouscapacity)
{
wcout << L"new capacity: " << v.capacity() << L" new size: " << v.size() << L" ratio: " << ((float) v.capacity()) / previouscapacity << '\n';
previouscapacity = v.capacity();
}
}
新容量:1 新尺寸:1 比率:1.#INF
新容量:2 新尺寸:2 比率:2
新容量:3 新尺寸:3 比率:1.5
新容量:4 新尺寸:4 比率:1.33333
新容量:6 新尺寸:5 比率:1.5
新容量:9 新尺寸:7 比率:1.5
新容量:13 新尺寸:10 比率:1.44444
新容量:19 新大小:14 比率:1.46154
新容量:28 新大小:20 比率:1.47368
新容量:42 新尺寸:29 比率:1.5
新容量:63 新尺寸:43 比率:1.5
新容量:94 新大小:64 比率:1.49206
新容量:141 新尺寸:95 比率:1.5
新容量:211 新大小:142 比率:1.49645
...
新容量:466609 新大小:311074 比率:1.5
新容量:699913 新大小:466610 比率:1.5
新容量:1049869 新大小:699914 比率:1.5
注意:我使用的是 VC++ 2013
【问题讨论】:
-
增长率取决于 AFAIK 的实现。将尺寸翻倍很受欢迎。您可以要求
capacity了解在需要重新分配之前可以容纳多少元素。 -
作为补充说明,如果您知道将有多少个元素,请在向量上使用
reserve()。 -
不要看你正在打印的那个比例。这是因为容量增加1.5倍后发生了一些四舍五入。例如 3*1.5=4.5 但新容量仍然是 4。而且,在扩展过程中总是使用复制构造函数复制向量。这就是 O(1) 加法被摊销的原因。
-
@AakashVerma 比率舍入并不重要。当大小足够大时,这里约为 1.5。