Как вы выполняете итерацию назад по списку STL?

Лучший / самый простой способ stl-containers изменить итерацию списка stl - это (как уже говорилось) использовать traversal обратные итераторы rbegin cpp / rend.

Однако я хотел упомянуть, что iterator реверсивные итераторы реализованы stl с сохранением «текущей» позиции list-comparison итератора по очереди (по c++ крайней мере, в реализации list стандартной библиотеки GNU).

Это cpp сделано для упрощения реализации, чтобы c++ диапазон в обратном порядке c++ имел ту же семантику, что cpp и диапазон в прямом направлении traversing [начало, конец) и [rbegin, rend)

Это cpp означает, что разыменование lists итератора включает создание traversing нового временного объекта listiterator с последующим его уменьшением cpp каждый раз:

  reference
  operator*() const
  {
_Iterator __tmp = current;
return *--__tmp;
  }

Таким образом, разыменование reverse_iterator происходит медленнее, чем обычного итератора.

Однако вместо stl-containers этого вы можете использовать iterators обычные двунаправленные итераторы, чтобы lists имитировать обратную итерацию traversing самостоятельно, избегая этих traversal накладных расходов:

for ( iterator current = end() ; current != begin() ; /* Do nothing */ )
{
    --current; // Unfortunately, you now need this here
    /* Do work */
    cout << *current << endl;
}

Тестирование traverse показало, что это решение python-list было ~ в 5 раз быстрее для каждого разыменования, используемого ilist в теле цикла.

Примечание. Тестирование iterator не проводилось с приведенным iterator выше кодом, так как std :: cout stl был бы узким местом.

Также traversal обратите внимание: разница iterator во времени на настенных часах ilist составляла ~ 5 секунд при list размере std :: list в 10 ilist миллионов элементов. Так stl-containers что, если реально размер traversal ваших данных не такой большой, просто iterator придерживайтесь rbegin() rend()!

c++

list

stl

iterator

traversal

2022-10-13T17:32:05+00:00