删除元素后,(c ++)向量是否收缩?

时间:2014-11-12 01:21:24

标签: c++ memory-management vector

每次添加元素时,每次空间用完时,矢量都会增加一倍,但是当你删除元素时呢?假设您向数组添加了800个元素,并且在添加第800个元素时,向量将其大小加倍,以便能够容纳1600个元素。现在,如果你开始把元素拿走到它唯一持有5或10个元素的位置呢?

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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滚动输出。