为什么 Boost.Range is_sorted不需要前向迭代器?
Why doesn't Boost.Range is_sorted require forward iterators?
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年破坏了它们?!?。
- 为什么范围算法与 std 的迭代器不兼容?
- 矢量迭代器不能与 std::shared_ptr<> 取消引用
- forward_list迭代器不兼容
- 向量迭代器不兼容的错误,用于保存另一个向量的迭代器的向量
- C++,弹出调试断言失败窗口,我得到矢量迭代器不兼容的错误运行时
- f.getline() 迭代器不增加
- 当我发生碰撞检测时,矢量迭代器不兼容
- 为什么C++字符串迭代器不检查错误?
- debug断言矢量迭代器不可用find_if删除
- 为什么标准容器迭代器不会重载"->*"?
- 为什么反向迭代器不是 C++17 标准下的正式迭代器类别?
- C XTREE崩溃在出口上,映射/设置迭代器不可用
- C++:为什么输出迭代器不支持比较操作?
- 迭代器不兼容错误
- C++向量迭代器不是增量的
- 为什么更多的迭代器不是随机访问?
- 为什么迭代器不返回集合的开头
- 字符串迭代器不兼容错误,当我将字符串转换为矢量<byte>时
- 迭代器不能被另一个相同大小的向量重用吗?
- LNK2038,迭代器不匹配错误,需要忽略