据我所知,当vector :: resize需要增加时,C ++标准没有准确指定向量容量的增加方式。但是,是否存在“典型”实施?
具体来说:我不知道我的载体需要多大。此外,元素以随机顺序排列。所以对于每个元素我都有:
if ( index >= vector.size() ) {
vector.resize ( index + 1 );
}
vector.at ( index ) = element;
如果元素的索引顺序递增,那么每次调用大小时(在典型的实现中),向量容量是否会增加1?我希望不是......
答案 0 :(得分:3)
该标准不保证重复调用resize()
的渐近性。容器将简单地增加容量以精确地达到所需的目标尺寸是完全可行的。事实上,在resize()
的大多数标准用例中,这可能是理想的行为(即最少浪费)(例如,它只使用一次 )。
如果您担心,只需实现自己的几何增长:
if (index + 1 > v.size()
{
if (v.capacity() < index + 1)
{
v.reserve(2 * (index + 1)); // I had 2 * capacity() here first, but
// I think this version is better
}
v.resize(index + 1);
}
答案 1 :(得分:0)
正如您所提到的,resize
完全取决于您的实现(并且可能在同一实现的不同版本之间发生变化)。
在合规性实施中,push_back
会使每次必须增加的容量增加一倍,这与一系列push_back
的摊销复杂性有关。如果每次增加1个容量,N
添加的复杂度将为O(N^2)
,而如果push_back
每次增加一倍的容量,则相同系列添加的复杂性只会是O(N)
- 这很重要。
至于你的问题 - 如果事先知道最大index
,只需预先分配。否则,我觉得你最好用std::map
:
map<int, T> M;
for (...) {
M[index] = element;
}
O(N log N)
添加的复杂度N
,但不会在没有相应element
的索引上浪费内存。