[英]Amortizing in std::vector::resize and std::vector::push_back
我们知道重新分配机制负责在调用std::vector::push_back()
时分配更多我们实际需要的内存。 通常容量随着乘数2x或黄金比率~1.618而增长......
假设,我们添加如下元素:
std::vector<int> v;
for(unsigned i = 0; i < 100000; ++i)
{
v.resize(v.size() + 1);
}
如果进行重新分配,是否可以保证向量的容量“加倍”? 换句话说:“+1 resize”是否会以与push_back
相同的方式分配内存。
或者它是一个纯粹的实现依赖的东西?
如果进行重新分配,是否可以保证向量的容量“加倍”?
不会。内存重新分配的复杂性是不变的。 对象的容量在需要时是加倍还是由另一个因子增加是依赖于实现的。
“+1 resize”是否会以与push_back相同的方式分配内存
是。
当sz
大于size()
时, std::vector::resize(size_type sz)
将sz - size()
值初始化元素附加到序列。 这相当于:
insert(end(), sz-size(), <value initialized object>);
std::vector::insert
, std::vector::emplace
和std::vector::push_back
具有相同的内存分配复杂度 - 摊销常量。
向量是一个序列容器,它在末尾支持(分期)恒定时间插入和擦除操作; [vector.overview]
和
如果size()<sz,则将sz-size()默认插入元素追加到序列中。
调整大小。 恕我直言,这意味着,是的,如果重新分配发生,保证向量的容量“加倍”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.