C++11 算法std::is_sorted
和std::is_sorted_until
两者都需要ForwardIterator
s。但是,Boost.Range 版本boost::is_sorted
只需要SinglePassRange
对应于InputIterator
s 的 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 行 about ++r
)
post: 之前值 of 的任何副本
r
不再需要是可解引用的或在==
.
注意:这并不是要“通过单个示例进行证明”,但似乎任何基于比较的算法(例如adjacent_find
)都必须需要前向迭代器才能在两个迭代器之间进行比较。
问题:为什么 Boost.Range 版本is_sorted
不需要更强的概念ForwardRange
(以及ForwardIterator
它的低级例程)std::is_sorted
?它是 Boost.Range 中的错误吗?