当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何缩小std::vector的大小?》经验,为你挑选了3个好方法。

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



1> Sébastien Ro..:

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

vector(persons).swap(persons);

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

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


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

2> Alex Korban..:

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


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

3> philsquared..:

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

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

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

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

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有