除了提前还有更多的负数吗?
答案 0 :(得分:83)
答案 1 :(得分:14)
也许最大的实际区别是std::next()
仅在C ++ 11中可用。
std::next()
默认会提前一个,而std::advance()
需要一段距离。
然后有返回值:
std::advance()
:(无)(传入的迭代器已修改)std::next()
: n 的继任者。 std::next()
与std::advance
一样使用负数,在这种情况下要求迭代器必须是双向的。当意图专门向后移动时,std::prev()
会更具可读性。
答案 2 :(得分:6)
<强>的std ::提前强>
函数advance()递增作为参数传递的迭代器的位置。因此,该函数允许迭代器向前(或向后)前进多个元素:
#include <iterator>
void advance (InputIterator& pos, Dist n)
- 允许输入迭代器pos向前n步元素(或向后)。
- 对于双向和随机访问迭代器,n可能为负向后退。
- Dist是模板类型。通常,它必须是整数类型,因为诸如&lt;,++, - 的操作和与0的比较是 调用。
- 请注意,advance()不会检查它是否越过了序列的end()(它无法检查,因为迭代器通常不知道 他们经营的集装箱)。因此,调用此函数可能 导致未定义的行为,因为调用operator ++作为结束 未定义序列。
std :: next (以及{+ 1}} C ++ 11中的新内容)
std::prev
- 如果向前移动1或n个位置,则产生前向迭代器pos所具有的位置。
- 对于双向和随机访问迭代器,n可能是负数以产生先前的命题。
- Dist的类型为std :: iterator_traits :: difference_type。
- 为内部临时对象调用advance(pos,n)。
- 请注意,next()不检查它是否越过序列的end()。因此,由调用者来确保结果 有效的。
来自#include <iterator>
ForwardIterator next (ForwardIterator pos)
ForwardIterator next (ForwardIterator pos, Dist n)
答案 3 :(得分:2)
它们几乎相同,只是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
只需要输入迭代器(如果不使用负距离)。