在C++中,std::vector 是一个动态数组,它能够根据需要自动地调整其大小。当你向 vector 中添加元素时,如果当前分配的内存不足以存储所有元素,vector 会自动重新分配更大的内存空间,并将旧元素复制(或移动,取决于C++版本和编译器优化)到新的内存区域。然而,vector 并不直接提供一个成员函数来“释放”其已分配但未使用的空间(即,减小其容量到当前大小或更小)。但是,你可以通过几种方式间接地实现这一目的。
使用 swap 技巧
如果你想减小 vector 的容量到其当前大小(即,只保留已使用的空间),你可以通过创建一个临时 vector 并使用 swap 成员函数来实现:
#include <vector>
#include <algorithm> // 用于 std::move_if_noexcept(可选)
std::vector<int> vec;
// ... 填充 vec ...
// 创建一个新的临时 vector,它的大小等于 vec 的当前大小
std::vector<int>(vec).swap(vec);
// 或者,在 C++11 及更高版本中,使用 std::move 来避免不必要的复制
std::vector<int>().swap(vec);
// 此时,vec 的容量被减小到其当前大小
注意:std::vector(vec) 创建了一个 vec 的副本,但因为是临时的,它会在 swap 之后被销毁,这时 vec 就拥有了这个临时 vector 的容量,即其当前大小。
使用 shrink_to_fit(C++11及以后)
从C++11开始,std::vector 提供了一个成员函数 shrink_to_fit,它请求容器减少其容量以匹配其大小。但请注意,这是一个请求,而不是保证:
#include <vector>
std::vector<int> vec;
// ... 填充 vec ...
vec.shrink_to_fit();
// vec 的容量可能会减小到其当前大小,但这并不是强制的
实现可能会因为性能考虑而忽略这个请求,特别是在重新分配成本较高的情况下。因此,shrink_to_fit 的效果可能依赖于具体的编译器和标准库实现。
总结
- 如果你确实需要释放 vector 分配但未使用的空间,可以尝试使用 swap 技巧或 shrink_to_fit(如果可用并适用)。
- swap 技巧是强制性的,但可能会引入额外的性能开销(尤其是当 vector 很大时)。
- shrink_to_fit 是请求性的,其效果可能因编译器和标准库的不同而有所不同。
- 在大多数情况下,让 vector 管理其内存通常是最好的选择,因为这样可以简化代码并可能提高性能。