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++) 的并行版本,它不需要我先用升序整数填充向量?
你可以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)
虽然我不能建议避免填充向量的方法,但我可以建议使用该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 函数g,iota语法也相当简单,恕我直言。