Как получить доступ к «предыдущему» элементу в цикле итератора списка C ++? - PullRequest
12 голосов
/ 07 апреля 2011

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

Чтобы быть более точным, мой цикл выглядит так:

for (iter=list_object.begin(); iter!= list_object_.end(); iter++)
  {
    function_1(*iter);
    function_2(*PREVIOUS_VALUE_IN_THE_LIST);
  }

Как мне получить доступ к этому предыдущему значению в списке?

Ответы [ 4 ]

17 голосов
/ 07 апреля 2011

std::list допускает только двунаправленную итерацию, поэтому вы можете перемещать итератор только на одну позицию за раз. Таким образом, вам нужно создать новый итератор:

iter_copy = iter;
--iter;

Очевидно, вы несете ответственность за обеспечение того, что предыдущий элемент действительно существует, прежде чем вы уменьшите итератор.

В C ++ 0x эта функциональность аккуратно обернута в функцию std::prev, которую может поддерживать ваша реализация Стандартной библиотеки C ++. Если нет, то это выглядит примерно так:

template <typename BidiIt>
BidiIt prev(BidiIt x, typename std::iterator_traits<BidiIt>::difference_type n=1)
{
    std::advance(x, -n);
    return x;
} 
16 голосов
/ 08 апреля 2011

Простой способ - просто отслеживать предыдущий элемент в цикле 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)
}

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

2 голосов
/ 07 апреля 2011

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

2 голосов
/ 07 апреля 2011

оператор-- уменьшает итератор.

std :: list имеет двунаправленный итератор.http://www.cplusplus.com/reference/std/iterator/BidirectionalIterator/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...