矢量容量和储备

Vector capacity and reserve

本文关键字:容量      更新时间:2023-10-16

请考虑以下代码片段:

std::vector<int> v;
v.reserve(100);
v.insert(v.end(), 100, 5);
v.erase(v.begin(), v.end());
std::cout << v.capacity << std::endl;

这将打印出100.这是否意味着矢量仍然包含 100 个内存位置?是否需要在向量上调用erase(begin,end)后调用reserve(0),以放弃向量占用的所有空间?

如果容量为 100

,则vector具有为 100 个元素分配的空间。 reserve(0)是无操作的,因为reserve不会缩小容量。

reserve(n)尝试将分配增加到至少 n 个元素的足够空间。不能保证它会成功,它不会报告失败,并且可能会过度分配。

不要调用reserve,除非你已经测量了有和没有它的代码,并发现它有很大的不同。reserve的所有其他用途都是过早优化。

您正在寻找著名的交换技巧:

vector<T>().swap(myVector);

请参阅此处以获取背景介绍

如何缩小标准::矢量?

提醒一下,C++0x/11 在 STL 容器中添加了shrink_to_fit便利功能,该函数在 VS2010 中已经可用,所以如果你在 Windows(使用 VS)上编码,那就很幸运了。 :)

是的,向量仍然包含 100 个位置。 reserve仅用于增加大小,不能缩小大小。reserve(0);调用将完全不起作用。在 C++1x 中,我相信会有一个您感兴趣的shrink_to_fit电话。

在当前标准中,您必须使用交换技巧来释放由向量分配的存储,但在这样做之前,请仔细考虑是否真的这样做。如果稍后再次将元素添加回向量,则只会重新分配。除非您使用的是嵌入式系统,否则只需让 vector 管理自己的内存即可。

交换技巧:使用vector<T>().swap(myvector);释放矢量的存储。