C ++ 11算法std::is_sorted
和std::is_sorted_until
都需要ForwardIterator
s。但是,Boost.Range版本boost::is_sorted
仅需要与SinglePassRange
s对应的InputIterator
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;
}
这里我们看到在*first
迭代器增量之后发生的++it
迭代器解除引用。这意味着Iterator
应该ForwardIterator
作为其必需类别。为什么?因为标准在
24.2.3输入迭代器[input.iterators] / p2 (见表107,关于++r
的行
发布:不再需要
r
之前值的任何副本 要么可以解除引用,要么属于==
。
注意:这不是“单个示例的证明”,但似乎任何基于比较的算法(例如adjacent_find
)都必然需要前向迭代器才能能够在两个迭代器之间进行比较。
问题:为什么is_sorted
的Boost.Range版本不需要更强的ForwardRange
(和ForwardIterator
概念用于其低级例程)std::is_sorted
所要求的?这是Boost.Range中的错误吗?
答案 0 :(得分:2)
看起来boost.algorithm中的迭代器版本正确需要ForwardIterators
。信不信由你,there are also range-based versions in boost.algorithm.最好的代码重复。根据{{3}},文档落后于源代码,Ticket #9367更正了文档的其余部分,以说明排序检查算法的所有类型都需要ForwardIterators
。
我希望<boost/algorithm/cxx11/is_sorted.hpp>
中的实现优于<boost/range/algorithm_ext/is_sorted.hpp>
中自2010年以来似乎有点腐烂的实现。
编辑:四处搜寻,似乎Boost.Range的实现 需要ForwardIterator
,但Changeset #86741。