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

时间:2014-02-26 10:10:07

标签: c++ algorithm c++11 iterator boost-range

C ++ 11算法std::is_sortedstd::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中的错误吗?

1 个答案:

答案 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