除了负数之外还有其他的吗?
也许最大的实际区别是 std::next()只能从 C + + 11中获得。
std::next()
std::next() 在默认情况下会前进一步,而 std::advance()则需要一段距离。
std::advance()
然后是返回值:
与 std::advance一样,std::next() 接受负数,在这种情况下,迭代器必须是双向的。如果意图是专门向后移动,则 std::prev()将更具可读性。
std::advance
std::prev()
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;
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;
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)
std::prev
#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
The C++ Standard Library Second Edition