
在C++中,std::vector 是一个动态数组,它能够根据需要自动地调整其大小。当你向 vector 中添加元素时,如果当前分配的内存不足以存储所有元素,vector 会自动重新分配更大的内存空间,并将旧元素复制(或移动,取决于C++版本和编译器优化)到新的内存区域。然而,vector 并不直接提供一个成员函数来“释放”其已分配但未使用的空间(即,减小其容量到当前大小或更小)。但是,你可以通过几种方式间接地实现这一目的。
如果你想减小 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 的容量,即其当前大小。
从C++11开始,std::vector 提供了一个成员函数 shrink_to_fit,它请求容器减少其容量以匹配其大小。但请注意,这是一个请求,而不是保证:
#include <vector>
std::vector<int> vec;
// ... 填充 vec ...
vec.shrink_to_fit();
// vec 的容量可能会减小到其当前大小,但这并不是强制的实现可能会因为性能考虑而忽略这个请求,特别是在重新分配成本较高的情况下。因此,shrink_to_fit 的效果可能依赖于具体的编译器和标准库实现。