2012-04-29 52 views
0

可能重复:
How to downsize std::vector?C++:减少与标准::向量保留空间::储备

根据cppreference,在标准::矢量::储备(为size_t n)的,n是“分配存储容量所需的最小数量”。我的问题是:如何避免只知道最大值的重新分配?

作为一个例子,假设我有一个整数列表,但我不知道这个列表的大小(例如这个列表来自读取文件)。但我知道这个列表的最大大小是1000.假设列表的实际大小为800.

目前,我使用std :: reserve(1000),然后使用push_back() 。使用保留我阻止任何重新分配。但是如何在push_backs结尾释放额外的空间? (在这个例子的情况下,如何释放1000-800 = 200多余的空间?)

非常感谢。

回答

3

您可以使用std::vector::shrink_to_fit()

std::vector<int> v; 
v.reserve(1000); 
for(int i=0;i<800;++i) 
    v.push_back(10); 

v.shrink_to_fit(); 
+1

这需要C++ 11支持。并不保证收缩任何东西。 – 2012-04-29 02:57:40

+0

@NicolBolas是的,标准说它是一个非绑定请求,并且“注意:该请求不具有约束力,允许实现特定优化的纬度。”质量实施可以选择不调整容量的一个例子是,当前容量已经足够低,以至于容器正在利用像小字符串优化那样的优势。 – bames53 2012-04-29 03:35:25

1

您基本上需要创建一个正确大小的新矢量并交换两个矢量的内容。幸运的是,在STL这是一个一行这里的例子:How to downsize std::vector?

+3

所以......这是一个重复的问题。 – Potatoswatter 2012-04-29 02:22:51