首页 > 解决方案 > C++17 是否提供生成器或其他内置方式来并行转换非实例化序列?

问题描述

我正在尝试在 C++17 中并行转换一系列数字并将结果存储在向量中。但到目前为止,我无法找到一种方法来表示序列而不用它显式填充数组,如下所示:

void transformRange(size_t N)
{
    // Want to replace nums with a generator (an iterator that is not associated with a container)
    std::vector<size_t> nums(N);
    std::iota(nums.begin(), nums.end(), 0);

    std::vector<size_t> a(N);
    std::transform(std::execution::par, nums.begin(), nums.end(), a.begin(), fun);
}

我希望这是并行可行的(因此 std::execution::par ),并且上面的转换确实并行工作,但 iota 没有,它是内存带宽的 3 倍。

我也愿意从对正在转换的值的引用中导出序列号,但我无法获得正确的语法。就像是:

void transformRange2(size_t N)
{
    std::vector<size_t> a(N);
    std::transform(std::execution::par, a.begin(), a.end(), a.begin(), [&](auto & i) {fun(&i - a.begin()); });
}

标签: c++rangec++17lazy-evaluationlazy-sequences

解决方案


不受容器支持的范围(或称为噩梦std::vector<bool>)不是 C++17 的一部分。

但不要绝望,Boost 提供了counting_iterator, 正是你需要的懒惰范围。

它甚至使用counting_range.


推荐阅读