【问题标题】:Access iterator in the function object of for_each wth execution policy使用执行策略访问 for_each 函数对象中的迭代器
【发布时间】:2019-08-29 22:13:41
【问题描述】:

当使用std::for_each() 从算法头中时,有什么方法可以访问迭代器以便找到我们正在处理的元素的索引?这在需要执行策略的情况下可能很有用。
考虑在第二个std::for_each() 中使用执行策略std::par_unseq 的以下示例(为简单起见删除了互斥锁和..),i++ 不能用于未定义行为的痛苦。那么有没有办法访问迭代器并找到索引而不必将索引与 vec2 元素配对?
还在寻找适用于所有容器的通用解决方案?

vector<int> vec1{1, 4, 5, 6, 9, 0, 3, 9};
vector<int> vec2{1, 5, 2, 3};
vector<int> vec3(4), vec4(4);

size_t i = 0;
for_each(vec2.begin(), vec2.end(), [&vec1, &vec3, &i](const auto& e) {
    vec3[i++] = vec1[e];
});

for_each(execution::par_unseq, vec2.begin(), vec2.end(), [&vec1, &vec4](const auto& e) {
    vec4[distance(vec2.begin(), current_iterator)] = vec1[e];
});

【问题讨论】:

标签: c++ c++17 std c++-standard-library parallel.foreach


【解决方案1】:

std::vector 具有连续的内存,因此您可以使用指针(并计算它们的差异)。

话虽如此,我不了解您最初的问题或动机,因此您可能需要考虑重新创建此问题并提供更多详细信息或对其进行编辑。

【讨论】:

    【解决方案2】:

    我知道您出于显而易见的原因不想使用 size_t i = 0; 类型的迭代器,我也不建议这样做。在将其与任何容器一起使用之前,请查找 distance 的迭代器有效性部分。

    当您将for_eachstd::par_unseq 一起使用时,它将完全是随机的。事实上,在我的测试中,您的第一个循环也是以随机顺序复制的。 {4,0,5,6} 而不是 {1,4,5,6}

    我建议您使用顺序容器并将其划分为范围,以便可以顺序并行化不同的范围,或者设计您自己的非顺序容器,该容器可以通过某些逻辑进行划分并并行使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多