std :: vector的容量是否会降低?

Jin*_*Yao 5 c++ vector std stdvector c++-standard-library

C++ 14最终工作草案做出如下评论std::vector:

存储管理是自动处理的,但可以提供提示以提高效率.

cppreference说:

矢量的存储自动处理,根据需要进行扩展和收缩.

动态数组的维基百科条目说:

C++ std::vector和Rust std::vec::Vec是动态数组的实现

所以我认为当一个向量的容量远大于它的大小时,它应该自动减少它的容量.我写了下面的代码来检查我的假设:

#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;
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

因此,std::vector即使容量远大于其容量,a似乎也不会降低容量.

std::vector不会减少它的容量?
那么是否有一些条件可以触发其产能的减少?

Cal*_*eth 5

所以我认为当一个向量的容量远大于它的大小时,它应该减少它的容量.

首先,标准必须指明"容量远大于其大小"的含义.这将限制当前实施对重新分配策略的选择.

其次,如果减少容量需要重新分配和移动所有剩余的元素.这意味着擦除会使所有迭代器无效,这会限制安全使用.

目前,擦除状态

在擦除点或之后使迭代器和引用无效,包括end()迭代器.

第三,矢量同样可能再次达到容量的高水印,因为它长时间保持较小.

对于许多有效场景,您将使用量变得更糟,因为释放大量分配的可疑益处.现代虚拟内存系统处理得很好,旧的分配比neccecary严格要长.

那么是否有一些条件可以触发其产能的减少?

是的,shrink_to_fit明确要求做你想做的事.如果你确实希望它重新分配到更小的尺寸,你可以要求它.其他用途可能会受到伤害,但不会受到影响.