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

By how much does vector::resize increase capacity?

本文关键字:容量 多少 增加 resize vector      更新时间:2023-10-16

据我所知,c++标准并没有明确规定当vector::resize需要增加时如何增加vector::resize。但是有"典型的"实现吗?

具体来说:我不知道我的向量需要多大。此外,元素的顺序是随机的。因此,对于每个元素,我都写上:

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

如果元素以索引递增的顺序出现,每次调用resize时,vector的容量会增加1吗(在典型的实现中)?

该标准不保证对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);
}

正如您所提到的,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;
}

对于N的添加,这将具有O(N log N)的复杂度,但不会在没有相应element的索引上浪费内存。