在std :: vector :: resize和std :: vector :: push_back中摊销

时间:2017-10-26 15:29:01

标签: c++ vector resize capacity

我们知道重新分配机制负责在调用std::vector::push_back()时分配更多我们实际需要的内存。 通常容量随着乘数2x或黄金比率数值增加~1.618 ...

假设我们添加如下元素:

std::vector<int> v;
for(unsigned i = 0; i < 100000; ++i)
{
    v.resize(v.size() + 1);
}

是否保证向量的容量是&#34;加倍&#34;如果重新分配? 换句话说:&#34; +1会调整大小&#34;以与push_back完成相同的方式分配内存。

或者它是一个纯粹依赖于实现的东西?

2 个答案:

答案 0 :(得分:1)

  

是否保证向量的容量是&#34;加倍&#34;如果重新分配?

没有。内存重新分配的复杂性是摊销不变的。对象的容量在需要时是加倍还是由另一个因子增加是依赖于实现的。

  

&#34; +1会调整大小&#34;以与push_back相同的方式分配内存

std::vector::resize(size_type sz)大于sz - size()时,

sz会将size()值初始化的元素附加到序列中。这相当于:

 insert(end(), sz-size(), <value initialized object>);

std::vector::insertstd::vector::emplacestd::vector::push_back具有相同的内存分配复杂度 - 摊销常量。

答案 1 :(得分:0)

  

vector是一个支持(摊销)常量的序列容器   时间插入和擦除操作结束; [vector.overview]

  

如果size()&lt; sz,将sz - size()默认插入元素附加到   序列

用于调整大小。恕我直言,这意味着,是的,如果重新分配发生,保证向量的容量“加倍”