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

时间:2013-02-22 04:50:21

标签: c++ c++11 std

除了提前还有更多的负数吗?

4 个答案:

答案 0 :(得分:83)

std::advance

  • 修改其参数
  • 什么都不返回
  • 适用于输入迭代器或更好(或者如果给出负距离,则适用于双向迭代器)

std::next

  • 将其论点保留为未修改
  • 返回参数的副本,按指定的数量提前
  • 适用于前向迭代器或更好(或者如果给出负距离则适用于双向迭代器))。

答案 1 :(得分:14)

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

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

然后有返回值:

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

答案 2 :(得分:6)

<强>的std ::提前

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

#include <iterator>
void advance (InputIterator& pos, Dist n)
  
      
  • 允许输入迭代器pos向前n步元素(或向后)。
  •   
  • 对于双向和随机访问迭代器,n可能为负向后退。
  •   
  • Dist是模板类型。通常,它必须是整数类型,因为诸如&lt;,++, - 的操作和与0的比较是   调用。
  •   
  • 请注意,advance()不会检查它是否越过了序列的end()(它无法检查,因为迭代器通常不知道   他们经营的集装箱)。因此,调用此函数可能   导致未定义的行为,因为调用operator ++作为结束   未定义序列。
  •   

std :: next (以及{+ 1}} C ++ 11中的新内容)

std::prev
  
      
  • 如果向前移动1或n个位置,则产生前向迭代器pos所具有的位置。
  •   
  • 对于双向和随机访问迭代器,n可能是负数以产生先前的命题。
  •   
  • Dist的类型为std :: iterator_traits :: difference_type。
  •   
  • 为内部临时对象调用advance(pos,n)。
  •   
  • 请注意,next()不检查它是否越过序列的end()。因此,由调用者来确保结果   有效的。
  •   

来自#include <iterator> ForwardIterator next (ForwardIterator pos) ForwardIterator next (ForwardIterator pos, Dist n)

答案 3 :(得分:2)

它们几乎相同,只是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.效果:增量(或负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;

请注意,如果迭代器是输入迭代器,两者实际上都支持负值。另请注意,std::next要求迭代器满足ForwardIterator的条件,而std::advance只需要输入迭代器(如果不使用负距离)。