How get next (previous) element in std::list without incrementing (decrementing) iterator?

43,908

Solution 1

Copying and incrementing/decrementing the copy is the only way it can be done.

You can write wrapper functions to hide it (and as mentioned in answers, C++11 has std::prev/std::next which do just that (and Boost defines similar functions). But they are wrappers around this "copy and increment" operation, so you don't have to worry that you're doing it "wrong".

Solution 2

Yes, since C++11 there are the two methods you are looking for called std::prev and std::next. You can find them in the iterator library.

Example from cppreference.com

#include <iostream>
#include <iterator>
#include <vector>

int main() 
{
    std::list<int> v{ 3, 1, 4 };

    auto it = v.begin();

    auto nx = std::next(it, 2);

    std::cout << *it << ' ' << *nx << '\n';
}

Output:

3 4

Solution 3

A simple precanned solution are prior and next from Boost.utility. They take advantage of operator-- and operator++ but don't require you to create a temporary.

Share:
43,908
Mihran Hovsepyan
Author by

Mihran Hovsepyan

Software Engineer at OneMarketData

Updated on July 09, 2022

Comments

  • Mihran Hovsepyan
    Mihran Hovsepyan almost 2 years

    Say I have an std::list<int> lst and some std::list<int>::iterator it for iterating through the list. And depended to value of the it I want to use it + 1 or it - 1 in my code. Is there some good way to do that like next(), prev() (I couldn't find such things in stl documentation)? Or should I copy the it each time and increment(decrement) the copy?

  • Matthieu M.
    Matthieu M. about 12 years
    Of course it should be mentionned that 1. They create the temporary on their own and 2. You'd better be aware of boundary conditions.
  • James Kanze
    James Kanze about 12 years
    And of course, if you don't have C++11, they're very easy to implement. (I think most of us had them in our toolkits well before they were even proposed for C++11.)