C++中的std::next 和 std::advance 区别
Std::advance和Std::next用于将迭代器向前移动一定的位置,这样就可以使迭代器指向想要的位置。虽然两者目的相同,但它们的实现却各不相同。这使得我们理解两者之间的区别变得很重要。在c++ 11中,std::next()默认会前进1,而std::advance()需要一个距离。
- 语法差异: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,它没有这样的默认实参。
示例
参数修改: 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指向它所指向的位置的前面两个空格,因此如果使用std::advance ii将指向前面两个空格,而如果使用std::next,则ii不会被推进,但会返回一个指向新位置的迭代器,并将其存储在iii中。
让我们用表格的形式来看看它们的区别:
序号 | std::next | std::advance |
---|---|---|
1. | 它用于返回迭代器的第n个继承者 | 它没有任何返回类型。 |
2. | 它接受两个形参:元素的数量和一个迭代器。 | 它接受两个形参,元素个数和迭代器 |
3. | 它的时间复杂度在最好的情况下是恒定的 | 它的时间复杂度在最好的情况下是恒定的 |
4. | 它的时间复杂度在最坏情况下是线性的 | 它的时间复杂度在最坏情况下是线性的 |