Скажем, у меня есть std::list<int> lst
и некоторая std::list<int>::iterator it
для итерации по списку. И зависит от значения it
Я хочу использовать it + 1
или it - 1
в своем коде. Есть ли хороший способ сделать это, как next()
, prev()
(я не мог найти такие вещи в документации stl)? Или мне нужно копировать it
каждый раз и увеличивать (уменьшать) копию?
Как получить следующий (предыдущий) элемент в std:: list без приращения (уменьшения) итератора?
Ответ 1
Копирование и увеличение/уменьшение копии - это единственный способ сделать это.
Вы можете написать функции-оболочки, чтобы скрыть его (и, как упоминалось в ответах, С++ 11 имеет std:: prev/std:: next, которые делают именно это (и Boost определяет аналогичные функции). Но они являются обертками вокруг этого "копировать и увеличивать", поэтому вам не нужно беспокоиться о том, что вы делаете это "неправильно".
Ответ 2
Да, поскольку С++ 11 есть два метода, которые вы ищете: std::prev
и std::next
. Вы можете найти их в библиотеке итератора.
Пример из 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';
}
Вывод:
3 4
Ответ 3
Простое предварительное решение: prior
и next
из Boost.utility
. Они используют operator--
и operator++
, но не требуют создания временного.