std::advancestd::next 用于将迭代器前进某个位置,这样就可以使迭代器指向所需的位置。虽然两者的目的相同,但它们的实现方式却互不相同。所以了解std::advancestd::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 没有这样的限制,因为它可以与任何迭代器一起使用,即使使用输入迭代器或比它更好。

欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。
转载请注明:文章转载自 有区别网 [http://www.vsdiffer.com]
本文标题:C++ 中的 std::next 与 std::advance 的区别
本文链接:https://www.vsdiffer.com/vs/stdnext-vs-stdadvance-in-cpp.html
免责声明:以上内容仅是站长个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。