Как вы выполняете итерацию назад по списку 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
Как вы выполняете итерацию назад по списку STL?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.