C++ 向量(vector)删除元素后会缩小吗?

7
向量在添加元素时会每次加倍其大小,但是当您删除元素时呢?比如向数组中添加了800个元素,在添加第800个元素时,向量将其大小加倍以能够容纳1600个元素。现在,如果您开始删除元素,直到仅保留5或10个元素,它会意识到向量比未来元素保留的空间的一半要小得多,并保留更少的空间吗?

8
如果您需要“保证”这一点(请注意,它在技术上可能会被忽略,但我认为没有任何东西这样做),请使用shrink_to_fit - chris
1
简短回答是不会—— erase() 不会减少 capacity() - Jerry Coffin
1
clear() 也不行。 - bialpio
shrink_to_fit 在 C++11 中被添加;在此之前,您必须使用“交换技巧”。 - M.M
@MattMcNabb: 这也不一定可靠。 - Lightness Races in Orbit
2个回答

10

当删除元素时,向量不会降低容量!这是为了将来有效地将元素添加到现有缓冲区中。


这不是唯一的方法:vec.resize(vec.size()); - bialpio
请停止传播减小容量技巧不是“尽力而为的解决方案”的误解!(链接:https://dev59.com/nVzUa4cB1Zd3GeqP22Ub) - Lightness Races in Orbit
我不理解“尽力而为的解决方案”是什么意思。 - Neil Kirk
好的,我刚刚删除了我的回答中的那部分内容,因为它会增加更多的混淆,而且他实际上并没有问如何缩小它,只是问它是否会缩小。 - Neil Kirk
1
在向量中删除元素后,您可以始终依赖于任何迭代器或指向该向量元素的指针(当然除了被删除的元素)。实际上不是这样的,erase() 会使得其后面的迭代器和引用无效。 - AlexD
2
@AlexD 很快就没有答案了。随意编辑答案或发布您自己的答案。我要睡觉了。 - Neil Kirk

1
如果它已经分配了一块内存,它将继续使用该内存块,因为释放一些内存再后来又需要分配更多的内存会导致效率低下。 我总是建议编写测试代码片段来测试这些东西。例如,我在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;
}

如果您编译和运行,您会发现容量永远不会缩小。即使擦除或删除一些元素后也是如此。
在Linux上,您可以使用 less 滚动输出。

这并不能证明它在你的编译器上是正确的。你需要参考规范来证明它。 - Neil Kirk
忘了提到。我正在使用GNU编译器集合中的g++。不确定如何正确表达。但是,它确实取决于向量的实现。 - user1944429

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接