Как получить доступ к "предыдущему" элементу в цикле итератора списка С++?

Я пытаюсь получить доступ к ранее повторенному элементу в цикле, проходящем через все элементы списка.

Чтобы быть более конкретным, мой цикл выглядит следующим образом:

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)
}

Это будет работать с итераторами, которые просто переадресованы, им не нужно быть двунаправленным.

Ответ 4

Есть две возможности. Либо --itor, либо std::advance(itor, -1).