首页 > 解决方案 > 使用执行策略访问 for_each 函数对象中的迭代器

问题描述

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

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++17stdc++-standard-libraryparallel.foreach

解决方案


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

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


推荐阅读