Do(c++)向量在移除元素后收缩

Do (c++) vectors shrink after elements are removed?

本文关键字:元素 c++ 向量 Do      更新时间:2023-10-16

添加元素时,每当矢量空间不足时,矢量的大小就会加倍,但删除元素时呢?假设你向一个数组添加了800个元素,在添加第800个元素后,向量的大小会翻倍,可以容纳1600个元素。现在,如果你开始去掉元素,直到它只容纳5或10个元素,该怎么办?

它会认识到向量比为未来元素保留的空间的一半小得多,并且保留的空间更少吗?

删除元素时,矢量的容量不会减少!这是为了允许将来的元素被有效地添加到现有的缓冲区中。

如果它已经分配了一块内存,它将继续使用它,因为它释放一些内存的效率很低,后来发现它必须分配更多的内存。

我总是建议编写一个测试代码片段来测试这类事情。

例如,我在2分钟内把这个放在一起,以验证我告诉你的是正确的信息:

#include <iostream>
#include <vector>
void printInfo(std::vector<char> &_vector)
{
  std::cout << "Size: " << _vector.size() << std::endl;
  std::cout << "Capacity: " << _vector.capacity() << std::endl;
  std::cout << std::endl;
}
int main()
{
  int numbElems = 10;
  std::vector<char> myvector;
  std::cout << "Nothing entered" << std::endl;
  printInfo(myvector);
  for (int i = 0; i < 10; i++) {
    for (int c = 0; c < numbElems; c++) {
      myvector.push_back(i);
    }
    std::cout << "Pushed " << numbElems << std::endl;
    printInfo(myvector);
  }
  for (int i = 0; i < 5; i++) {
    for (int c = 0; c < numbElems; c++) {
      myvector.pop_back();
    }
    std::cout << "Popped " << numbElems << std::endl;
    printInfo(myvector);
  }
  myvector.erase(myvector.begin(), myvector.end());
  printInfo(myvector);
  std::cout << "max_size: " << myvector.max_size() << std::endl;
  return 0;
}

如果编译并运行,您将看到Capacity的大小永远不会下降。即使在擦除之后,或者一些元件被移除。

在linux上,您可以使用less来滚动输出。