簡體   English   中英

為什么並行for_each需要前向迭代器?

[英]Why does the parallel for_each require forward iterators?

我正在設計一個遍歷多個容器的迭代器,因此有一個代理對象作為返回類型。 因此,它可以做的最好是成為一個輸入迭代器(這是因為前向迭代器需要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迭代器概念將前向迭代器定義為最弱的迭代器形式,它需要在相同范圍內運行多個迭代器。 也就是說,您可以復制前向迭代器,增加副本,但仍然可以通過原始迭代器訪問原始值。

純IntputIterator概念只需要單遍。 一旦遞增迭代器,它的所有其他副本實際上都是無效的。

能夠並行化for_each最終需要每次並行調用以獲得一組獨特的迭代器和值來進行操作。 這意味着迭代器必須是可復制的並且獨立於其他迭代器。 這需要他們成為前向迭代器。

現在是的,這意味着你不能使用並行for_each代理迭代器,即使你的迭代器是相互獨立的。 這只是C ++ 17迭代器概念模型的局限性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM