vector :: resize增加了多少容量?

时间:2011-12-22 12:46:11

标签: c++ resize stdvector capacity

据我所知,当vector :: resize需要增加时,C ++标准没有准确指定向量容量的增加方式。但是,是否存在“典型”实施?

具体来说:我不知道我的载体需要多大。此外,元素以随机顺序排列。所以对于每个元素我都有:

if ( index >= vector.size() ) {
    vector.resize ( index + 1 );
}
vector.at ( index ) = element;

如果元素的索引顺序递增,那么每次调用大小时(在典型的实现中),向量容量是否会增加1?我希望不是......

2 个答案:

答案 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的索引上浪费内存。