为什么要设置矢量的大小

时间:2015-04-01 00:30:04

标签: c++

是否存在使用大小初始化矢量的性能原因?

例如vector<myClass> v(10);而不是vector<myClass> v和push_back根据需要?

2 个答案:

答案 0 :(得分:3)

vector<myClass> v(10)预先分配内部数组,并使用10个默认构造的myClass对象自动填充它。

vector<myClass> v没有预先分配数组,但您可以使用reserve()resize()

每当新push_back()超过当前size()时,

capacity()将重新分配和复制内部数组。

答案 1 :(得分:2)

如果push_back()将向量增加到当前capacity()之后,它将重新分配其数组,这是无效的。

所以,如果你告诉向量确切地要存储多少元素,那么你不需要支付重新分配向量的成本,特别是如果向量必须改变内存中的位置(因为它不会适合它的位置,因此它自己复制(额外费用!)。

Reallocation of a vector.

Resize.


但你相信我吗?也许。你 应该相信事实:

测试代码

#include <vector>
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>

using namespace std;

int main() {
  const int N = 1000000;

  using namespace std::chrono;
  {

  // push_back only

  high_resolution_clock::time_point t1 = high_resolution_clock::now();
  vector<int> v1;
  for(int i = 0; i < N; ++i)
    v1.push_back(i);
  high_resolution_clock::time_point t2 = high_resolution_clock::now();

  duration<double> time_span = duration_cast<duration<double>>(t2 - t1);

  std::cout << "It took me " << time_span.count() << " seconds.";
  std::cout << std::endl;
  }

  {
  // set size and use operator []

  high_resolution_clock::time_point t1 = high_resolution_clock::now();
  vector<int> v2(N);
  for(int i = 0; i < N; ++i)
    v2[i] = i;
  high_resolution_clock::time_point t2 = high_resolution_clock::now();

  duration<double> time_span = duration_cast<duration<double>>(t2 - t1);

  std::cout << "It took me " << time_span.count() << " seconds.";
  std::cout << std::endl;
  }
  return 0;
}

输出

It took me 0.0170491 seconds.
It took me 0.00236058 seconds.

正如您所看到的,实验结果表明,通过设置矢量的大小,我们可以快一个数量级。

time measurements的来源。