Как получить доступ к "предыдущему" элементу в цикле итератора списка С++?
Я пытаюсь получить доступ к ранее повторенному элементу в цикле, проходящем через все элементы списка.
Чтобы быть более конкретным, мой цикл выглядит следующим образом:
for (iter=list_object.begin(); iter!= list_object_.end(); iter++)
{
function_1(*iter);
function_2(*PREVIOUS_VALUE_IN_THE_LIST);
}
Как мне получить доступ к этому предыдущему значению в списке?
Ответы
Ответ 1
std::list
выполняется только двунаправленно, поэтому вы можете перемещать только итератор по одной позиции за раз. Таким образом, вам нужно создать новый итератор:
iter_copy = iter;
--iter;
Очевидно, что вы несете ответственность за то, что предыдущий элемент действительно существует до того, как вы уменьшите итератор.
В С++ 0x эта функция аккуратно завершена в функции std::prev
, которую может поддерживать реализация стандартной библиотеки С++. Если нет, это выглядит примерно так:
template <typename BidiIt>
BidiIt prev(BidiIt x, typename std::iterator_traits<BidiIt>::difference_type n=1)
{
std::advance(x, -n);
return x;
}
Ответ 2
Простым способом является просто отслеживать предыдущий элемент цикла for, например:
for( list_t::iterator iter=obj.begin(), prev=obj.end();
iter != obj.end(); prev=iter, ++iter )
{
function_1(*iter);
if( prev != obj.end() )
function_2(*prev)
}
Это будет работать с итераторами, которые просто переадресованы, им не нужно быть двунаправленным.
Ответ 3
Оператор уменьшает итератор.
std:: list имеет двунаправленный итератор. http://www.cplusplus.com/reference/std/iterator/BidirectionalIterator/
Ответ 4
Есть две возможности. Либо --itor
, либо std::advance(itor, -1)
.