std :: advance和std :: next用于将迭代器前进某个位置,这样我们就可以使迭代器指向所需的位置。尽管两者具有相同的目的,但是它们的实现彼此不同。这对于我们理解两者之间的区别非常重要。
在C++ 11中,默认情况下,std :: next()会前进一个,而std :: advance()需要一个distance 。
- 语法差异: 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
#include #include #include using namespace std; int main() { // Declaring first container deque v1 = { 1, 2, 3 }; // Declaring second container for // copying values deque v2 = { 4, 5, 6 }; deque ::iterator ii; ii = v1.begin(); // ii points to 1 in v1 deque ::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中。
- 参数修改: std :: advance修改其参数,使其指向所需的位置,而std :: next不会修改其参数,实际上它将返回一个指向所需位置的新迭代器。
- 前提条件: std :: next要求作为参数传递的迭代器的类型至少为正向迭代器,而std :: advance则没有这种限制,因为它可以与任何迭代器一起使用,甚至可以与输入迭代器一起使用,甚至更好。
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。