C++14 final working draft对std::vector
发表以下评论:
cppreference说:
Wikipedia entry for Dynamic array说:
因此,我认为 vector 的容量远大于其大小时,应该自动减少其容量。我编写了以下代码来检查我的假设:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {};
cout << "initialization" << endl;
cout << " capacity: " << v.capacity() << endl;
cout << " size: " << v.size() << endl;
for (int i = 1; i <= 10000; i++)
v.push_back(i);
cout << "after inserting a lot of elements" << endl;
cout << " capacity: " << v.capacity() << endl;
cout << " size: " << v.size() << endl;
v.erase(v.begin() + 1, v.begin() + 10000);
cout << "after erasing a lot of elements" << endl;
cout << " capacity: " << v.capacity() << endl;
cout << " size: " << v.size() << endl;
v.push_back(9);
cout << "after inserting another element" << endl;
cout << " capacity: " << v.capacity() << endl;
cout << " size: " << v.size() << endl;
}
我使用
g++ -std=c++14 code.cc
来编译代码。运行结果a.out
会产生以下输出。我正在使用macOS Mojave。initialization
capacity: 0
size: 0
after inserting a lot of elements
capacity: 16384
size: 10000
after erasing a lot of elements
capacity: 16384
size: 1
after inserting another element
capacity: 16384
size: 2
因此,即使
std::vector
的容量远大于其大小,似乎也不会减少其容量。std::vector
会减少容量吗?那么,是否存在某些条件导致其容量减少?
最佳答案
首先,该标准必须规定“容量远大于容量”的含义。这将限制当前实现方案对重新分配策略的选择。
其次,如果减少容量,则需要重新分配和移动所有剩余的元素。这意味着擦除可能会使所有迭代器无效,从而限制了安全使用。
目前,擦除状态
第三, vector 很可能再次达到其容量的高水位标记,并且可能长时间保持不变。
对于许多有效方案,由于释放大量分配的可疑好处,您会使使用情况变得更糟。现代虚拟内存系统可以很好地处理旧分配,而分配的时间要比必要时间更长。
是的,shrink_to_fit
是明确要求您执行所需操作的请求。如果您确实希望将其重新分配为较小的大小,则可以要求这样做。其他用法(可能会受碎片影响)不受影响。
关于c++ - 是否会减少std::vector的容量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52791430/