有效填充已知大小的矢量

时间:2017-03-16 18:05:51

标签: c++ performance vector

我想创建一个已知大小的std::vector<int>并立即用一些生成的值填充它。有没有办法做到这一点,没有(1)首先将矢量零填充到所需的大小或(2)在每个元素上使用reserve然后push_back

例如,要使用值{size-1填充向量:

// method 1
vector<int> fill_resize(int s) {
  vector<int> v(s);
  for (int i = 0; i < s; i++) {
    v[i] = i;
  }
  return v;
}

// method 2
vector<int> fill_push_back(int s) {
  vector<int> v;
  v.reserve(s);
  for (int i = 0; i < s; i++) {
    v.push_back(i);
  }
  return v;
}

方法(1)通过冗余零填充浪费时间,并且方法(2)在每个插入物上需要push_back的机制,实际上编译得很差。

在有人跳入并说“编译器很聪明之前,他们会为你优化这个!” - -O2上有关前沿编译器的check out the generated assembly。这是非常可怕的,push_back变种在糟糕的情况下消失了 1

1 有趣的是,糟糕的push_back版本仍然可以获得非常大的向量,因为您主要受内存带宽的限制,以及方法1的零填充方法占用带宽的2倍。 push_back方法至少只在值上循环一次,但使用慢循环。

1 个答案:

答案 0 :(得分:3)

你可以: