C++14 final working draftstd::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/

10-12 06:06