【问题标题】:Efficiently populate vector of known size有效地填充已知大小的向量
【发布时间】:2017-03-16 18:05:50
【问题描述】:

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

例如,用值 0 填充向量到 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的机制,实际上编译效果很差。

在有人插嘴说“编译器很聪明,他们会为你优化这个!” - check out the generated assembly 在尖端编译器上-O2。这很糟糕,push_back 变体在糟糕透顶1.


1有趣的是,糟糕的push_back 版本仍然会在非常大的向量中胜出,因为在那里你主要受内存带宽的限制,而方法 1 的零然后填充方法需要 2 倍带宽。 push_back 方法至少只对值循环一次,但使用的是慢循环。

【问题讨论】:

标签: c++ performance vector


【解决方案1】:

你可以:

【讨论】:

  • 谢谢。我特别喜欢第二个想法,因为它非常轻量级并且不需要新的实现。
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多