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?
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".
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 <list>
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
std::advance()
instead. –
Shem 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".
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.
if you realize your own list, you can write your own internal class Iterator, where you can easy realize next() and prev() methods throw the reloading of operator--() and operator++()
© 2022 - 2025 — McMap. All rights reserved.
it++
, it translates asit = it + 1
, meaning technically the iterator object could just as well be a new object everytime. Not sure what you're asking. – Selfstyledstd::prev
/std::next
which do just that. But they are wrappers around this "copy and increment" operation – Naumachia"it + 1"
and"it - 1"
to the quotes because they are not valid operations of the bidirectional iterator. Do you care if I add them back? – Attributive