std :: advance和std :: next有什么区别?

是否有更多超越前进负数?

std::advance

  • 修改它的论点
  • 什么也不返回
  • 在input迭代器上工作或者更好(或者如果给定负距离,则为双向迭代器)

std::next

  • 没有修改它的论点
  • 返回参数的副本,按指定的数量提前
  • 在前向迭代器或更好的情况下工作(或者如果给定负距离,则为双向迭代器))

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

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

然后有返回值:

  • std::advance() :(无)(传入的迭代器被修改)
  • std::next() :第n个inheritance者。

std::next()采用负数,就像std::advance ,在这种情况下需要迭代器必须是双向的。 std::prev()将更具可读性,当意图是专门向后移动时。

的std ::提前

函数advance()增加了作为parameter passing的迭代器的位置。 因此,该函数可以让迭代器向前(或向后)多个元素:

 #include <iterator> void advance (InputIterator& pos, Dist n) 
  • 让input迭代器向前( 或向后 )推进n个元素。
  • 对于双向和随机访问迭代器,n可能是负向的。
  • Dist是一个模板types。 通常,它必须是一个整型,因为像<,++, – 和与0比较的操作被调用。
  • 请注意,advance()不检查它是否跨越序列的end()(它不能检查,因为迭代器通常不知道它们在哪个容器上运行)。 因此,调用此函数可能会导致未定义的行为,因为未定义调用operator ++作为序列的结尾。

std :: next (和std::prev new在C ++ 11中)

 #include <iterator> ForwardIterator next (ForwardIterator pos) ForwardIterator next (ForwardIterator pos, Dist n) 
  • 如果向前移动1或n个位置,则产生前向迭代器pos将具有的位置。
  • 对于双向和随机访问迭代器,n可能是负的以产生先前的命题。
  • Dist是typesstd :: 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.要求:只适用于双向和随机访问迭代器
3.效果:递增(或递减为负n)迭代器引用i 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; advance(x, n); return x;

请注意,如果迭代器是input迭代器, 实际上都支持负值。 还要注意, std::next需要迭代器满足ForwardIterator的条件,而std::advance只需要一个Input Iterator(如果不使用负距离)。