为什么 Boost.Range is_sorted不需要前向迭代器?

Why doesn't Boost.Range is_sorted require forward iterators?

本文关键字:迭代器 不需要 sorted Boost Range is 为什么      更新时间:2023-10-16

C++11算法std::is_sortedstd::is_sorted_until都需要ForwardIterators。然而,Boost。范围版本boost::is_sorted只需要对应于InputIterators的SinglePassRanges。特别是,它委托了一个基于迭代器的实现,如下所示:

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年破坏了它们?!?。