为什么平行for_each需要前进迭代器
Why does the parallel for_each require forward iterators?
i正在设计一个迭代器,该迭代器越过多个容器,因此将代理对象作为返回类型。因此,它可以做的最好的是成为输入迭代器(这是因为前进迭代器要求reference
是实际的参考类型,而在我看来,对于输入迭代器而言,这并不是这样)。
(我说)普通的for_each
像我的迭代器一样工作。
但是,当我查看其并行版本时,我看到它仅接受前迭代剂。因此,我不能使用复杂的迭代器,该迭代器与它返回代理对象,这很烦人。
另一方面,我在线查找其他值得注意的实现,这并不像我最初想象的那样常见 - 例如,英特尔TBB为接受输入迭代器的每个人提供了自己的平行。
我的问题是:为什么并行std::for_each
与输入迭代器不起作用?
我看不到它们是向前迭代器的重点,因为乍一看,即使输入迭代器也应该很好地工作。我想念什么?
c 17迭代器模型有一个已知缺陷,因为代理迭代器只能是输入迭代器,因为您指出的原因。这有很多缺点。并行算法不需要非磁性迭代器,但是它们绝对需要需要多通用保证。当前的迭代类别模型将两个迭代组合在一起。
使用C 20范围,我们得到了iterator_concept
的想法,这是向后兼容的垫片,可适当支持代理迭代器。例如,您可以拥有input_iterator_tag
的iterator_category
,但可以使用forward_iterator_tag
的iterator_concept
。新的ForwardIterator
概念不考虑类别,它查看该概念:
template<class I> concept ForwardIterator = InputIterator<I> && DerivedFrom<ITER_CONCEPT(I), forward_iterator_tag> && Incrementable<I> && Sentinel<I, I>;
平行算法是否会改变是我无法回答的另一个问题。
c 17迭代概念将正向迭代器定义为最弱的迭代形式,它需要在相同范围内的多个迭代器才能函数。也就是说,您可以复制远期迭代器,递增副本,但仍可以通过原始迭代器访问原始值。
纯插图标能概念仅需要单通道。一旦您增加了迭代器,其所有其他副本就会有效无效。
能够并行化for_each
最终需要每个并行调用,以获取一组不同的迭代器和值以进行操作。这意味着迭代器必须是可复制的,并且独立于其他迭代器。这要求它们要向前迭代。
现在是的,这意味着您也不能使用具有并行for_each
的代理迭代器,即使您的迭代器相互独立。这只是C 17迭代概念模型的局限性。
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 如何在C++中将迭代器作为函数参数传递
- 是否应避免从非常量迭代器转换为常量迭代器?
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 为什么 C++ std::unordered_map 从 emplace/ 找到返回一个迭代器?