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

What's the difference between std::advance and std::next?

本文关键字:std 区别 什么 next advance      更新时间:2023-10-16

除了超前取负数之外还有更多吗?

std::advance

  • 修改其论点
  • 不返回任何内容
  • 适用于输入迭代器或更好的迭代器(如果给定负距离,则适用于双向迭代器)

std::next

  • 不修改其参数
  • 返回参数的副本,按指定的金额提前
  • 适用于前向迭代器或更好的迭代器(如果给定负距离,则适用于双向迭代器)

也许最大的实际区别是std::next()只能从C++11中获得。

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

然后是返回值:

  • std::advance():(none)(传入的迭代器被修改)
  • std::next():第n个继承者

std::next()std::advance一样取负数,在这种情况下要求迭代器必须是双向的。当意图特别是向后移动时,CCD_ 10将更具可读性。

std::advance

函数advanced()递增作为参数传递的迭代器的位置。因此,该函数允许迭代器前进(或后退)不止一个元素:

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

std::next(以及C++11中的std::prev新)

#include <iterator>
ForwardIterator next (ForwardIterator pos)
ForwardIterator next (ForwardIterator pos, Dist n)
  • 产生前向迭代器pos在向前移动1或n个位置时的位置
  • 对于双向和随机访问迭代器,n可以为负以产生先前的position
  • 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.效果:递增(或递减负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只需要输入迭代器(如果不使用负距离)。