除了进阶部分,是否还有处理负数的内容?
或许最大的实际区别是 std::next()
仅在 C++11 及以上版本可用。
std::next()
默认情况下会向前移动一个,而 std::advance()
需要指定距离。
然后就是返回值:
std::advance()
:(无)(传入的迭代器被修改)std::next()
:第 n 个后继。std::next()
和 std::advance
一样可以接受负数参数,但是在这种情况下,迭代器必须是双向迭代器。当特别想要向后移动时,使用 std::prev()
可以让代码更加易读。
next
不仅向前移动,它在这方面类似于 advance
。鉴于存在 prev
,写 next(it, -1)
可能有些奇怪,因为这是一个否定的文字。但对于正确类别的迭代器,例如写 next(it, distance(it2, it3))
即使 it2 > it3
也是可以的。 - Steve Jessopstd::next()
在 C++11 之后就可用了,不仅仅是在 C++11 中。 - Johnstd::advance
函数 advance() 增加传递作为参数的迭代器的位置。因此,该函数允许迭代器向前(或向后)移动多个元素:
#include <iterator>
void advance (InputIterator& pos, Dist n)
- 让输入迭代器pos向前(或向后)移动n个元素。
- 对于双向迭代器和随机访问迭代器,n可以为负数以向后移动。
- Dist是一个模板类型。通常,它必须是一个整数类型,因为会调用<,++,--,以及与0的比较等操作。
- 注意,advance()不会检查是否越过序列的end()(因为迭代器通常不知道它们所操作的容器)。因此,调用这个函数可能会导致未定义行为,因为针对序列的结尾调用operator ++是没有定义的。
std::next(和C++11中新增的std::prev
)
#include <iterator>
ForwardIterator next (ForwardIterator pos)
ForwardIterator next (ForwardIterator pos, Dist n)
- 返回向前移动1或n个位置后,正向迭代器pos的位置。
- 对于双向和随机访问迭代器,n可以是负数,以返回先前的位置。
- 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
:
请注意,如果迭代器是输入迭代器,则两者都支持负值。此外,请注意,std::next要求迭代器满足ForwardIterator的条件,而std::advance仅需要一个Input Iterator(如果您不使用负距离)。24.4.4 Iterator operations [iterator.operations]
template <class InputIterator, class Distance> void advance(InputIterator& i [remark: reference], Distance n);
2. Requires: n shall be negative only for bidirectional and random access iterators
3. Effects: Increments (or decrements for negative n) iterator reference i by n.
[...]
template <class ForwardIterator> ForwardIterator next(ForwardIterator x, [remark: copy] typename std::iterator_traits<ForwardIterator>::difference_type n = 1);
6. Effects: Equivalent to
advance(x, n); return x;
next
定义为保证工作的效果,即使它不是前向迭代器,但它仍然是UB。 - Steve Jessop++
(或者advance
,以保护自己免受涉及next
的一行代码的便利性的摧残),或者编写自己的my_next
,这可能与你实现的std::next
完全相同,也许去掉了特征断言。我想到了同样的论点,InputIterator不应该需要operator++(int)
。现在修复已经太晚了,我想。 - Steve Jessopstd::next
的额外约束已被取消,详情请参考http://cplusplus.github.io/LWG/lwg-defects.html#2353。 - T.C.