C++ 中的 std next 与 std advance 的区别
std::advance
和 std::next
用于将迭代器前进某个位置,这样就可以使迭代器指向所需的位置。虽然两者的目的相同,但它们的实现方式却互不相同。所以了解 std::advance
和 std::next
两者之间的区别很重要。
在 C++11 中,默认情况下 std::next()
将前进一个,而 std::advance()
需要一个距离。
1、语法差异: std::advance 和 std::next 的语法是:
// Definition of std::advance()
template
void advance( InputIt& it, Distance n );
it: Iterator to be advanced
n: Distance to be advanced
// Definition of std::next()
ForwardIterator next (ForwardIterator it,
typename iterator_traits::difference_type n = 1);
it: Iterator pointing to base position
n: Distance to be advanced from base position.
- 返回类型 –
std::advance
不返回任何内容,而std::next
在从给定基本位置推进n
个位置后返回一个迭代器。 - 语法相同 – 与
std::next()
的语法一样,它至少会将迭代器前进一个位置,即使没有指定它必须前进的位置,因为它具有默认值1
,而如果使用std::advance
,它没有这样的默认参数。
2、工作
- 参数修改:
std::advance
修改它的参数,使其指向所需的位置,而std::next
不修改它的参数,实际上它返回一个指向所需位置的新迭代器。
// C++ program to demonstrate
// std::advance vs std::next
#include <iostream>
#include <iterator>
#include <deque>
#include <algorithm>
using namespace std;
int main()
{
// Declaring first container
deque<int> v1 = { 1, 2, 3 };
// Declaring second container for
// copying values
deque<int> v2 = { 4, 5, 6 };
deque<int>::iterator ii;
ii = v1.begin();
// ii points to 1 in v1
deque<int>::iterator iii;
iii = std::next(ii, 2);
// ii not modified
// For std::advance
// std::advance(ii, 2)
// ii modified and now points to 3
// Using copy()
std::copy(ii, iii, std::back_inserter(v2));
// v2 now contains 4 5 6 1 2
// Displaying v1 and v2
cout << "v1 = ";
int i;
for (i = 0; i < 3; ++i) {
cout << v1[i] << " ";
}
cout << "nv2 = ";
for (i = 0; i < 5; ++i) {
cout << v2[i] << " ";
}
return 0;
}
运行结果:
v1 = 1 2 3
v2 = 4 5 6 1 2
说明: 可以看出,我们想让 ii
指向它所指向的位置前面的 2 个空格,所以如果使用 std::advance
ii 将指向前面的两个空格,而如果使用 std::next
,那么 ii
不会被推进,但会返回一个指向新位置的迭代器,并存储在 iii
中。
3、先决条件: std::next
要求作为参数传递的迭代器的类型至少为前向迭代器,而 std::advance
没有这样的限制,因为它可以与任何迭代器一起使用,即使使用输入迭代器或比它更好。