当条件first
未满足时,官方C ++标准对算法说了什么,last
和requires
是传递给标准算法之一的迭代器?
我看到三种可能性:
我很困惑,因为在算法描述中,我没有看到first
和last
的{{1}}条款。
EDIT1:这是对问题的简化。一个更精确的版本是"通过连续应用last
无法从first
访问operator++
时算法会发生什么?
EDIT2:我问的是这个问题,因为我正在实现std::reverse
的特化,我想知道我是否应该检查这个条件,或者我是否可以在{{1}时允许函数做一些完全错误的事情无法从last
到达
答案 0 :(得分:6)
您正在寻找的文本位于迭代器部分(强调我的):
[iterator.requirements.general] / 7-8
迭代器j被称为可从迭代器i到达,当且仅当存在有限的应用程序序列时 使得i == j的表达式++ i。如果j可以从i到达,则它们引用相同序列的元素。
在数据结构上运行的大多数库的算法模板都有使用范围的接口。 范围是一对指定计算开始和结束的迭代器。范围[i,i)是一个 空的范围; 通常,范围[i,j]是指以元素开头的数据结构中的元素 由i指向但不包括j指向的元素。范围[i,j]有效且当且仅当 j可以从i到达。将库中的函数应用于无效范围的结果未定义。
标准明确指出,将无效(未实现)范围传递给标准算法会导致未定义的行为。算法本身确实以[first, last)
格式指定范围。
请注意/ 7不允许交换随机访问迭代器的参数,因为您无法反复应用++first
来到达last
。