C++ C++;:使用std::vector::reserve减少保留空间

C++ C++;:使用std::vector::reserve减少保留空间,c++,memory-management,stdvector,C++,Memory Management,Stdvector,可能重复: 根据cppreference,在std::vector::reserve(size_t n)中,n是“作为已分配存储容量所需的最小数量”。我的问题是:如何避免只知道最大值的任何再分配 例如,假设我有一个整数列表,但我不知道这个列表的大小(例如,这个列表来自文件的读取)。但是我知道这个列表的最大大小是1000。假设列表的实际大小是800 目前,我使用std::reserve(1000),然后使用push_back()循环。使用保留我防止任何再分配。但是如何在推背结束时释放额外的空间呢

可能重复:

根据cppreference,在std::vector::reserve(size_t n)中,n是“作为已分配存储容量所需的最小数量”。我的问题是:如何避免只知道最大值的任何再分配

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

目前,我使用std::reserve(1000),然后使用push_back()循环。使用保留我防止任何再分配。但是如何在推背结束时释放额外的空间呢?(在本例中,如何释放1000-800=200额外空间?)


非常感谢。

您基本上需要创建一个大小正确的新向量,并交换两个向量的内容。幸运的是,在STL中,这是一个单行程序,下面是一些示例:

您基本上需要以正确的大小创建一个新的向量,并交换两个向量的内容。幸运的是,在STL中,这是一个单行程序,下面是一些示例:

您可以使用
std::vector::shrink\u to_fit()

std::vector v;
v、 储备(1000);

对于(int i=0;i您可以使用
std::vector::shrink_to_fit()

std::vector v;
v、 储备(1000);

对于(int i=0;iSo)来说,这是一个重复的问题。因此,这是一个重复的问题。它需要C++11支持。并且不保证收缩任何内容。@Nicolas Bolas是的,标准说这是一个非绑定请求,“注意:该请求是非绑定的,以允许实现特定的优化。”质量实现可能选择不调整容量的一个例子是,当前容量已经足够低,容器正在利用诸如小字符串优化之类的优势。这需要C++11支持。并且不保证收缩任何内容。@Nicolas Bolas是的,标准说这是一个无约束力的要求st和“注意:请求是非绑定的,以允许实现特定优化的自由度。”质量实现可能选择不调整容量的一个示例是,当前容量已经足够低,容器正在利用小字符串优化之类的优势。
std::vector<int> v;
v.reserve(1000);
for(int i=0;i<800;++i)
    v.push_back(10);

v.shrink_to_fit();