c++ - 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()); });
}
解决方案
不受容器支持的范围(或称为噩梦std::vector<bool>
)不是 C++17 的一部分。
但不要绝望,Boost 提供了counting_iterator
, 正是你需要的懒惰范围。
它甚至使用counting_range
.
推荐阅读
- mongodb - MongoDB连接安全
- javascript - 如果 CDN 失败,如何使用 javascript 回退到本地服务器以获得 fontawesome?
- python - 如何将包含列表字符串的字节转换为 Python 对象?
- javascript - 如何将类添加和删除到 div 元素纯 javascript
- java - 如何从 CallableStatement 样板代码中删除重复项?
- node.js - 获得与 Node.js 一起使用的安全 WebSocket 的最低要求是什么?
- sql - 将所有位置分组到一个位置
- javascript - 与 javascript innerText 属性混淆
- java - 绘制圆形对象后将其传递给 Arraylist
- python - 用 Pandas 计算每行的 NaN