C++11算法std::is_sorted
和std::is_sorted_until
都需要ForwardIterator
s。然而,Boost。范围版本boost::is_sorted
只需要对应于InputIterator
s的SinglePassRange
s。特别是,它委托了一个基于迭代器的实现,如下所示:
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;
}
在这里,我们看到了在++it
迭代器增量之后发生的*first
迭代器解引用。这意味着Iterator
应该将ForwardIterator
作为其所需的类别。为什么?因为标准在中这么说
24.2.3输入迭代器[Input.iterators]/p2(见表107中关于++r
的行)
post:不再需要
r
以前值的任何副本或者是可解引用的或者是在CCD_ 13的域中。
注意:这并不是"一个例子的证明",但似乎任何基于比较的算法(例如adjacent_find
)都必须需要前向迭代器才能在两个迭代器之间进行比较。
问题:为什么Boost没有。范围版本的is_sorted
需要更强的ForwardRange
概念(以及ForwardIterator
的低级例程),这是std::is_sorted
所要求的?这是Boost中的一个错误吗。范围
看起来boost.algorithm中的迭代器版本正确地需要ForwardIterators
。信不信由你,boost.agorithm中也有基于范围的版本。代码复制处于最佳状态。根据Ticket#9367,文档落后于源,变更集#86741更正文档的其余部分,以声明所有类型的排序检查算法都需要ForwardIterators
。
我更喜欢<boost/algorithm/cxx11/is_sorted.hpp>
中的实现,而不是自2010年以来似乎有点腐烂的<boost/range/algorithm_ext/is_sorted.hpp>
中的实现。
编辑:四处挖掘,似乎是Boost。范围实现确实需要ForwardIterator
,但这次提交在2010年破坏了它们?!?。