【问题标题】:Do (c++) vectors shrink after elements are removed?删除元素后(c ++)向量会缩小吗?
【发布时间】:2014-11-12 01:21:23
【问题描述】:

向量在添加元素时,每次空间不足时,它们的大小都会加倍,但是当你删除元素时呢?假设您将 800 个元素添加到数组中,并且在添加第 800 个元素时,向量的大小会增加一倍,以便能够容纳 1600 个元素。现在如果你开始拿走元素到它只包含 5 或 10 个元素的程度怎么办?

它会认识到向量远小于为未来元素保留的空间大小的一半并保留更少的空间吗?

【问题讨论】:

  • 如果您需要“保证”这一点,请使用 shrink_to_fit(请注意,它可以在技术上被忽略,但我认为没有任何作用)。
  • 简短的回答是否定的——erase() 不会减少 capacity()
  • clear() 也没有。
  • shrink_to_fit 在 C++11 中添加;在此之前,您必须进行“交换黑客”

标签: c++ memory-management vector


【解决方案1】:

删除元素时向量的容量不会减少!这是为了让未来的元素能够有效地添加到现有缓冲区中。

【讨论】:

  • 这不是唯一的方法:vec.resize(vec.size());
  • 请停止传播关于减少容量的技巧不是a best-effort solution的神话!
  • 我不明白“尽力而为的解决方案”是什么意思。
  • "从向量中删除元素后,您始终可以依赖任何迭代器或指向向量元素的指针(当然,除了已删除的元素)。" Not reallyerase() 在擦除点或擦除点之后使迭代器和引用无效。
  • @AlexD 很快就没有答案了。随意编辑答案或发布您自己的答案。我要睡觉了。
【解决方案2】:

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

我总是建议编写一个测试 sn-p 的代码来测试这些东西。

例如,我在 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 滚动浏览输出。

【讨论】:

  • 这确实在您的编译器上证明了这一点。您需要参考规范来证明这一点。
  • 忘了说。我正在使用 GNU 编译器集合的g++。不知道如何正确表达。但是是的,它确实取决于向量的实现。
猜你喜欢
  • 2021-07-03
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多