为什么平行for_each需要前进迭代器

Why does the parallel for_each require forward iterators?

本文关键字:迭代器 each for 为什么      更新时间:2023-10-16

i正在设计一个迭代器,该迭代器越过多个容器,因此将代理对象作为返回类型。因此,它可以做的最好的是成为输入迭代器(这是因为前进迭代器要求reference是实际的参考类型,而在我看来,对于输入迭代器而言,这并不是这样)。

>

(我说)普通的for_each像我的迭代器一样工作。
但是,当我查看其并行版本时,我看到它仅接受前迭代剂。因此,我不能使用复杂的迭代器,该迭代器与它返回代理对象,这很烦人。
另一方面,我在线查找其他值得注意的实现,这并不像我最初想象的那样常见 - 例如,英特尔TBB为接受输入迭代器的每个人提供了自己的平行。

我的问题是:为什么并行std::for_each与输入迭代器不起作用?
我看不到它们是向前迭代器的重点,因为乍一看,即使输入迭代器也应该很好地工作。我想念什么?

c 17迭代器模型有一个已知缺陷,因为代理迭代器只能是输入迭代器,因为您指出的原因。这有很多缺点。并行算法不需要非磁性迭代器,但是它们绝对需要需要多通用保证。当前的迭代类别模型将两个迭代组合在一起。

使用C 20范围,我们得到了iterator_concept的想法,这是向后兼容的垫片,可适当支持代理迭代器。例如,您可以拥有input_iterator_tagiterator_category,但可以使用forward_iterator_tagiterator_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迭代概念模型的局限性。