除了提前取负数之外,还有更多的东西吗?
4 回答
- 修改它的论点
- 什么都不返回
- 适用于输入迭代器或更好(如果给定负距离,则为双向迭代器)
- 保持其论点不变
- 返回参数的副本,按指定数量提前
- 适用于前向迭代器或更好的迭代器(如果给定负距离,则为双向迭代器))
也许最大的实际区别是std::next()
仅在 C++11 中可用。
std::next()
默认情况下会前进一个,而std::advance()
需要一个距离。
然后是返回值:
std::advance()
: (none) (传入的迭代器被修改)std::next()
: 第n个继任者。
std::next()
像 一样接受负数std::advance
,在这种情况下要求迭代器必须是双向的。std::prev()
当意图专门向后移动时,会更具可读性。
标准::提前
函数 Advance() 递增作为参数传递的迭代器的位置。因此,该函数让迭代器前进(或后退)多个元素:
#include <iterator>
void advance (InputIterator& pos, Dist n)
- 让输入迭代器 pos 向前(或向后)步进 n 个元素。
- 对于双向和随机访问迭代器,n 可能为负数以向后退。
- Dist 是一个模板类型。通常,它必须是整数类型,因为调用了诸如 <、++、-- 以及与 0 的比较等操作。
- 请注意,Advance() 不检查它是否穿过序列的 end()(它无法检查,因为迭代器通常不知道它们操作的容器)。因此,调用此函数可能会导致未定义的行为,因为未定义为序列结尾调用运算符 ++。
std::next(和std::prev
C++11 中的新功能)
#include <iterator>
ForwardIterator next (ForwardIterator pos)
ForwardIterator next (ForwardIterator pos, Dist n)
- 如果向前移动 1 或 n 个位置,则产生向前迭代器 pos 将具有的位置。
- 对于双向和随机访问迭代器,n 可能为负以产生先前的位置。
- Dist 是 std::iterator_traits::difference_type 类型。
- 为内部临时对象调用 Advance(pos,n)。
- 请注意,next() 不检查它是否穿过序列的 end()。因此,由调用者来确保结果有效。
引用自The C++ Standard Library Second Edition
它们几乎相同,只是std::next
返回一个副本并std::advance
修改其参数。请注意,该标准要求std::next
行为类似于std::advance
:
24.4.4 迭代器操作[iterator.operations]
template <class InputIterator, class Distance> void advance(InputIterator& i [remark: reference], Distance n);
2. 要求:仅对于双向和随机访问迭代器,n 应为负数
。 3. 效果:将迭代器引用 i 递增(或负数 n 递减)n。
[...]template <class ForwardIterator> ForwardIterator next(ForwardIterator x, [remark: copy] typename std::iterator_traits<ForwardIterator>::difference_type n = 1);
6.效果:相当于
advance(x, n); return x;
请注意,如果迭代器是输入迭代器,则两者实际上都支持负值。另请注意,std::next
要求迭代器满足 ForwardIterator 的条件,而std::advance
只需要 Input Iterator(如果您不使用负距离)。