C++ 11算法std::is_sorted
和std::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中的錯誤嗎?
確實這似乎是可疑的。 –
@MatthieuM。我想知道,如果可以通過緩存已讀取的最後一個值使其適用於輸入迭代器? – TemplateRex
然後它會對所述價值強加一個要求:它必須是可複製的。 –