2014-02-26 49 views
11

C++ 11算法std::is_sortedstd::is_sorted_until都需要ForwardIterator s。但是,Boost.Range版本boost::is_sorted僅需要SinglePassRange s,其對應於InputIterator s。特別是,它委託給這樣的一個基於迭代器的實現:爲什麼不Boost.Range is_sorted需要前向迭代器?

template<class Iterator, class Comp> 
inline Iterator is_sorted_until (Iterator first, Iterator last, Comp c) { 
    if (first == last) 
    return last; 

    Iterator it = first; ++it; 

    for (; it != last; first = it, ++it) 
    if (c(*it, *first)) 
     return it; 

    return it; 
} 

在這裏,我們看到了*first迭代器解引用++it迭代增量後出現這種情況。這意味着Iterator應該具有ForwardIterator作爲其所需的類別。爲什麼?因爲標準是這樣說的在

24.2.3輸入迭代[input.iterators]/P2(參照表107用約++r線)

交:的r先前值的任何副本不再需要 或者是可解引用的或在==的域中。

注意:這並非是「通過簡單的例子證明」,但似乎任何基於比較算法(例如adjacent_find)必然要求前向迭代器,以便能夠做一個比較在兩個迭代器之間。

問題:爲什麼不的is_sorted的Boost.Range版本要求(其低級例程和ForwardIterator)由std::is_sorted需要的ForwardRange更強的概念?它是Boost.Range中的錯誤嗎?

+0

確實這似乎是可疑的。 –

+0

@MatthieuM。我想知道,如果可以通過緩存已讀取的最後一個值使其適用於輸入迭代器? – TemplateRex

+1

然後它會對所述價值強加一個要求:它必須是可複製的。 –

回答

2

它看起來像boost.algorithm中的迭代器版本正確要求ForwardIterators。信不信由你,there are also range-based versions in boost.algorithm.代碼重複最好。根據Ticket #9367,文檔落後於源,Changeset #86741糾正了其他文檔,指出所有類型的排序檢查算法都需要ForwardIterators

我會比那些<boost/range/algorithm_ext/is_sorted.hpp>這似乎是有點腐爛喜歡在實現從<boost/algorithm/cxx11/is_sorted.hpp> 2010年

編輯:挖四周,看來Boost.Range實現需要ForwardIterator,但this commit broke them in 2010?!?

+0

+1並被接受。感謝您在Boost上挖掘所有污垢。很好地說這是一團糟。 – TemplateRex

相關問題