72

除了提前取负数之外,还有更多的东西吗?

4

4 回答 4

109

std::advance

  • 修改它的论点
  • 什么都不返回
  • 适用于输入迭代器或更好(如果给定负距离,则为双向迭代器)

std::next

  • 保持其论点不变
  • 返回参数的副本,按指定数量提前
  • 适用于前向迭代器或更好的迭代器(如果给定负距离,则为双向迭代器))
于 2013-02-22T04:54:32.050 回答
20

也许最大的实际区别是std::next()仅在 C++11 中可用。

std::next()默认情况下会前进一个,而std::advance()需要一个距离。

然后是返回值:

std::next()像 一样接受负数std::advance,在这种情况下要求迭代器必须是双向的。std::prev()当意图专门向后移动时,会更具可读性。

于 2013-02-22T04:54:01.363 回答
7

标准::提前

函数 Advance() 递增作为参数传递的迭代器的位置。因此,该函数让迭代器前进(或后退)多个元素:

#include <iterator>
void advance (InputIterator& pos, Dist n)
  • 让输入迭代器 pos 向前(或向后)步进 n 个元素。
  • 对于双向和随机访问迭代器,n 可能为负数以向后退。
  • Dist 是一个模板类型。通常,它必须是整数类型,因为调用了诸如 <、++、-- 以及与 0 的比较等操作。
  • 请注意,Advance() 不检查它是否穿过序列的 end()(它无法检查,因为迭代器通常不知道它们操作的容器)。因此,调用此函数可能会导致未定义的行为,因为未定义为序列结尾调用运算符 ++。

std::next(和std::prevC++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

于 2013-02-22T05:03:13.113 回答
4

它们几乎相同,只是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(如果您不使用负距离)。

于 2013-02-22T05:02:38.307 回答