C++中的std::next 和 std::advance 区别

C++中的std::next 和 std::advance 区别

Std::advance和Std::next用于将迭代器向前移动一定的位置,这样就可以使迭代器指向想要的位置。虽然两者目的相同,但它们的实现却各不相同。这使得我们理解两者之间的区别变得很重要。在c++ 11中,std::next()默认会前进1,而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,它没有这样的默认实参。

示例

参数修改: 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. 它的时间复杂度在最坏情况下是线性的 它的时间复杂度在最坏情况下是线性的

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程