How get next (previous) element in std::list without incrementing (decrementing) iterator?
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.
Comments
-
Mihran Hovsepyan almost 2 years
Say I have an
std::list<int> lst
and somestd::list<int>::iterator it
for iterating through the list. And depended to value of theit
I want to useit + 1
orit - 1
in my code. Is there some good way to do that likenext()
,prev()
(I couldn't find such things in stl documentation)? Or should I copy theit
each time and increment(decrement) the copy? -
Matthieu M. about 12 yearsOf 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 about 12 yearsAnd 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.)