c++ - 重新初始化 vector 的最快方法是什么?

标签 c++ performance c++11

将大型 vector 的所有值重置为其默认值的最快方法是什么?

struct foo
{
  int id;
  float score;
};

std::vector<foo> large_vector(10000000);

最简单的方法是创建一个新 vector ,但我想重新分配内存比重新初始化现有 vector 需要更多时间?

在重置之前,我必须遍历 vector 以收集非零分数(可能是数千或数百万)。我应该在这个循环中一个一个地重置结构吗?

编辑:

vector 大小是固定的,“默认值”意味着每个结构成员(所有 float 和整数)都为 0。

最佳答案

What's the fastest way to reinitialize a vector?

不要。

只需通过调用 clear() 记录 vector 没有有效条目的事实.这样做的好处是既(可能)是最优的,又能保证正确,而且还具有完美的表现力。除非分析显示实际需要,否则不应考虑 IMO 建议的替代方案。

您的元素类型是微不足道的,因此复杂性的线性上限实际上应该是一个体面质量实现的常数 - 没有必要依次销毁每个元素。

没有内存被释放,或者以后需要重新分配。

当你在 clear()ing 之后写入 vector 时,你只需要 push_backemplace_back,而不是使用运算符[]

为了与第一次使用保持一致,不要使用 10000000 个值构造元素初始化 vector ,而是使用 reserve(10000000) 进行预分配而不初始化。

例如。

int main() {
  vector<foo> v;
  v.reserve(10000000);

  while(keep_running) {
    use(v);
    v.clear();
  }
}

// precondition: v is empty, so
// don't access v[i] until you've done
//   v.push_back({id,score})
// at least i+1 times
void use(vector<foo> &v) {
}

由于您需要就地清零元素,因此第二快的通用解决方案可能是将上面的循环更改为

  while(keep_running) {
    v.resize(10000000);
    use(v);
    v.clear();
  }

或者删除 clear() 并使用 fill() 就地覆盖所有元素。

如果非零元素是稀疏的(如果您根据某个有意义的索引更新它们可能会出现这种情况),那么当您的主循环遍历 vector 时,将它们动态归零可能会更快。

同样,您确实需要分析以找出哪个更适合您的用例。

关于c++ - 重新初始化 vector 的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55266468/

相关文章:

c++ - 新动态字符数组末尾的空字符

c++ - 作为微优化,是否值得用 C 而不是 C++ 编写部分代码?

c++ - 将 std::unique_ptr 传递给辅助函数

c++ - 公共(public)删除或私有(private)默认构造函数/分配/复制构造函数?

c++ - 在嵌套命名空间中转发声明

c++ - 当我无法立即处理数据时,如何避免内存泄漏

c++ - 为什么有的引用类型的变量可以绑定(bind)右值,有的不能?

c++ - 如果对象被删除,正在运行的方法会发生什么?

java - JVM性能调优: young copy vs old generation gc

c - 在 C 语言中,使用全局变量对堆栈有帮助吗?