c++ 如何优雅地将 c++17 并行执行与计算整数的 for 循环一起使用?

use*_*931 7 c++ parallel-processing c++17

我可以

std::vector<int> a;
a.reserve(1000);
for(int i=0; i<1000; i++)
    a.push_back(i);
std::for_each(std::execution::par_unseq, std::begin(a), std::end(a), [&](int i) {
  ... do something based on i ...
});
Run Code Online (Sandbox Code Playgroud)

但是有没有更优雅的方法来创建 for(int i=0; i<n; i++) 的并行版本,它不需要我先用升序整数填充向量?

Cor*_*mer 7

你可以std::generate用来创建一个向量{0, 1, ..., 999}

std::vector<int> v(1000);
std::generate(v.begin(), v.end(), [n = 0] () mutable { return n++; });
Run Code Online (Sandbox Code Playgroud)

有一个接受 a 的重载,ExecutionPolicy因此您可以将上述内容修改为

std::vector<int> v(1000);
std::generate(std::execution::par, v.begin(), v.end(), [n = 0] () mutable { return n++; });
Run Code Online (Sandbox Code Playgroud)


Adr*_*ica 6

虽然我不能建议避免填充向量的方法,但我可以建议使用该std::iota()函数作为(也许)最有效/最优雅的方法来填充它的递增整数:

std::vector<int> a(1000);
std::iota(std::begin(a), std::end(a), 0);
std::for_each(std::execution::par_unseq, std::begin(a), std::end(a), [&](int i) {
  // ... do something based on i ...
});
Run Code Online (Sandbox Code Playgroud)

的复杂性std::iota正是last - first 增量和赋值,而std::generate函数具有last - first 调用g()和赋值的复杂性。即使一个体面的编译器要为 内联一个简单的增量 lambda 函数giota语法也相当简单,恕我直言。