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(如果不使用负距离)。