📜  C++ 中的 std::next 与 std::advance

📅  最后修改于: 2021-09-12 10:46:08             🧑  作者: Mango

std::advance 和 std::next 用于将迭代器前进某个位置,以便我们可以使迭代器指向所需的位置。虽然两者的目的相同,但它们的实现却各不相同。这使我们了解两者之间的区别很重要。
在 C++11 中,默认情况下 std::next() 将前进1 ,而 std::advance() 需要一个distance

  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() 的语法一样,它至少会将迭代器前进一个 position ,即使我们没有指定它必须前进的位置,因为它具有默认值 1,而如果我们使用 std: :advance,它没有这样的默认参数。
  2. 在职的
    • 参数修改: 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 中。

  3. 先决条件: std::next 要求作为参数传递的迭代器的类型至少为前向迭代器,而 std::advance 没有这样的限制,因为它可以与任何迭代器一起使用,甚至可以与输入迭代器或比它更好的迭代器一起使用。
想要从精选的视频和练习题中学习,请查看C++ 基础课程,从基础到高级 C++ 和C++ STL 课程,了解基础加 STL。要完成从学习语言到 DS Algo 等的准备工作,请参阅完整的面试准备课程