如何缩小std :: vector的大小?

bom*_*ier 34 c++ stl vector

std::vector当我不再需要以前预留的空间时,有没有办法调整容量以降低容量?

Séb*_*rra 60

有效的STL,作者:Scott Meyers,第17项:使用swap技巧来减少多余的容量.

vector<Person>(persons).swap(persons);
Run Code Online (Sandbox Code Playgroud)

在那之后,persons"缩小到适合".

这依赖于以下事实:vector复制构造函数仅根据所复制元素的需要分配内存.

  • 一旦向量分配了缓冲区,就很难删除[]缓冲区的结尾.这样做只是保证将来的插入需要分配一个新的缓冲区并复制一切(使迭代器无效). (2认同)

Ale*_*ban 18

如果您使用的是C++ 11,则可以使用vec.shrink_to_fit().至少在VS2010中,这对你来说是交换技巧.

  • @CatPlusPlus`colrow_to_fit`很可能会执行交换技巧或`realloc`,但是使用一个小的向量优化仍然不会重置`capacity()`来匹配`size()`,因为没有堆分配要收缩.我认为这就是它被指定为"非约束力"的原因. (6认同)
  • 我说"在VS2010",但是,在其他编译器上它可能不会这样做. (2认同)

phi*_*red 8

从现有的向量中创建一个新的临时向量,然后在现有向量上调用swap方法,传递临时方法.让临时(现在使用旧的超大缓冲区)超出范围.

嘿presto,你的矢量具有完全正确的内容大小.

如果这听起来像是大量的复制和分配 - 请记住,这就是向量每次必须重新分配超过其当前保留限制时所做的事情.

[编辑]是的,我刚才用更多的话说塞巴斯蒂安.stackoverflow竞争条件的另一个案例;-)