我想使用以下方法为基于并行索引的 for 循环设置一个简单的解决方法std::views
.
为了按顺序运行,代码如下所示:
int main() {
//pseudo-random numbers
random_device rd;
default_random_engine eng(rd());
uniform_int_distribution<int> distr(0, 100);
auto r = ranges::views::iota(0, 10);
vector<double> v(10, 1);
for_each(r.begin(), r.end(), [&](int i) {v[i] = distr(eng); });
for (auto&& i : v) cout << i << " "; cout << endl;
}
这很好用。我正在使用标准版本std::for_each()
,不是中的那个ranges
命名空间,因为它们没有执行策略。现在是并行版本。唯一的区别:
for_each(execution::par, r.begin(), r.end(), [&](int i) {v[i] = distr(eng); });
MSVC 报错:
error C2338: Parallel algorithms require forward iterators or stronger
我在这里发现了类似的问题:在并行算法中使用 range::view::iota我实施了那里提供的解决方案:
auto r = views::iota(0) | views::take(10);
vector<double> v(10, 1);
auto input_range = ranges::common_view(r);
for_each(execution::par, ranges::begin(input_range), ranges::end(input_range), [&](int i) {v[i] = distr(eng); });
for (auto&& i : v) cout << i << " "; cout << endl;
但是,我仍然面临错误
error C2338: Parallel algorithms require forward iterators or stronger.
有人知道这个问题是否有解决方案?