Open In App

std::next in C++

Last Updated : 02 Aug, 2017
Improve
Improve
Like Article
Like
Save
Share
Report

std::next returns an iterator pointing to the element after being advanced by certain no. of positions. It is defined inside the header file .

It does not modify its arguments and returns a copy of the argument advanced by the specified amount. If it is a random-access iterator, the function uses just once operator + or operator – for advancing. Otherwise, the function uses repeatedly the increase or decrease operator (operator ++ or operator –) on the copied iterator until n elements have been advanced.

Syntax:

ForwardIterator next (ForwardIterator it,
       typename iterator_traits::difference_type n = 1);
it: Iterator to the base position.
difference_type: It is the numerical type that represents 
distances between iterators of the ForwardIterator type.
n: Total no. of positions by which the
iterator has to be advanced. In the syntax, n is assigned
a default value 1 so it will atleast advance by 1 position.

Returns: It returns an iterator to the element 
n positions away from it.




// C++ program to demonstrate std::next
#include <iostream>
#include <iterator>
#include <deque>
#include <algorithm>
using namespace std;
int main()
{
    // Declaring first container
    deque<int> v1 = { 1, 2, 3, 4, 5, 6, 7 };
  
    // Declaring another container
    deque<int> v2 = { 8, 9, 10 };
  
    // Declaring an iterator
    deque<int>::iterator i1;
  
    // i1 points to 1
    i1 = v1.begin();
  
    // Declaring another iterator to store return
    // value and using std::next
    deque<int>::iterator i2;
    i2 = std::next(i1, 4);
  
    // Using std::copy
    std::copy(i1, i2, std::back_inserter(v2));
    // Remember, i1 stills points to 1
    // and i2 points to 5
    // v2 now contains 8 9 10 1 2 3 4
  
    // Displaying v1 and v2
    cout << "v1 = ";
  
    int i;
    for (i = 0; i < 7; ++i) {
        cout << v1[i] << " ";
    }
  
    cout << "\nv2 = ";
    for (i = 0; i < 7; ++i) {
        cout << v2[i] << " ";
    }
  
    return 0;
}


Output:

v1 = 1 2 3 4 5 6 7
v2 = 8 9 10 1 2 3 4

How can it be helpful ?

  • Advancing iterator in Lists: Since, lists support bidirectional iterators, which can be incremented only by using ++ and – – operator. So, if we want to advance the iterator by more than one position, then using std::next can be extremely useful.




    // C++ program to demonstrate std::next
    #include <iostream>
    #include <iterator>
    #include <list>
    #include <algorithm>
    using namespace std;
    int main()
    {
        // Declaring first container
        list<int> v1 = { 1, 2, 3, 7, 8, 9 };
      
        // Declaring second container
        list<int> v2 = { 4, 5, 6 };
      
        list<int>::iterator i1;
        i1 = v1.begin();
        // i1 points to 1 in v1
      
        list<int>::iterator i2;
        // i2 = v1.begin() + 3;
        // This cannot be used with lists
        // so use std::next for this
      
        i2 = std::next(i1, 3);
      
        // Using std::copy
        std::copy(i1, i2, std::back_inserter(v2));
        // v2 now contains 4 5 6 1 2 3
      
        // Displaying v1 and v2
        cout << "v1 = ";
      
        int i;
        for (i1 = v1.begin(); i1 != v1.end(); ++i1) {
            cout << *i1 << " ";
        }
      
        cout << "\nv2 = ";
        for (i1 = v2.begin(); i1 != v2.end(); ++i1) {
            cout << *i1 << " ";
        }
      
        return 0;
    }

    
    

    Output:

    v1 = 1 2 3 7 8 9
    v2 = 4 5 6 1 2 3  
    

    Explanation: Here, just look how if we want copy only a selected portion of the list, then we can make use of std::next, as otherwise we cannot use any +=, -= operators with bidirectional iterators supported by lists. So, we used std::next and directly advanced the iterator by three positions.



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads