Std: : forward 和 std: : next 的区别是什么?

除了负数之外还有其他的吗?

27316 次浏览

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

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

然后是返回值:

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

std::advance

  • 修改它的论点
  • 一无所获
  • 工作在输入迭代器或更好(或双向迭代器,如果负距离给定)

std::next

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

它们几乎相同,除了 std::next返回一个拷贝,而 std::advance修改它的参数。请注意,该标准要求 std::next的行为与 std::advance相似:

24.4.4迭代器操作[ Iterator.operation ]

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只需要一个 Input Iterator (如果不使用负距离)。

预付款

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

#include <iterator>
void advance (InputIterator& pos, Dist n)
  • 允许输入迭代器将 n 个元素前进(或者倒退)。
  • 对于双向迭代器和随机访问迭代器,n 可能是负值,以便向后退一步。
  • Dist 是一种模板类型。通常,它必须是一个整数类型,因为诸如 < 、 + + 、——和与0的比较之类的操作都是 电话。
  • 注意,forward ()不检查它是否跨越序列的 end ()(它不能检查,因为迭代器通常不知道 因此,调用这个函数可能会 结果会出现未定义行为,因为调用运算符 + + 表示结束 没有定义序列的。

Next (以及 C + + 11中的 std::prev new)

#include <iterator>
ForwardIterator next (ForwardIterator pos)
ForwardIterator next (ForwardIterator pos, Dist n)
  • 产生如果向前移动1或 n 个位置,则前向迭代器 pos 将具有的位置。
  • 对于双向和随机访问迭代器,n 可能为负,以产生先前的位置。
  • Dist 类型为 std: : iterator _ trait: : different _ type。
  • 为内部临时对象调用 Advanced (pos,n)。
  • 注意 next ()不检查它是否跨越序列的 end ()。因此,由调用方确保结果是 有效。

引自 The C++ Standard Library Second Edition