Подтвердить что ты не робот

Каковы недостатки std:: reverse_iterator?

Документация для boost специализированных адаптеров итераторов утверждает, что boost::reverse_iterator "Исправляет многие из недостатков С++ 98 std:: reverse_iterator."

Каковы эти недостатки? Я не могу найти описание этих недостатков.

ВОПРОС ПОСЛЕДУЮЩИХ ВОПРОСОВ:

Как boost:: reverse_iterator исправляет эти недостатки?

4b9b3361

Ответ 1

Ну, большая проблема в том, что они не являются итераторами вперед, и там есть вещи, которые в значительной степени ожидают итераторов вперед. Итак, вам нужно сделать несколько смешных преобразований, чтобы заставить работать. Чтобы назвать некоторые проблемы

  • В некоторых версиях erase() и insert() требуются итераторы, а не обратные итераторы. Это означает, что если вы используете обратные итераторы, и вы хотите insert() или erase(), вам нужно будет использовать функцию обратного итератора base(), чтобы получить доступ к переходу итератора. Автоматическое преобразование отсутствует.

  • base() возвращает форвардный итератор, эквивалентный обратному итератору с точки зрения вставки. То есть вставляйте вставки перед текущим элементом. Следовательно, элемент, на который обращается обратный итератор, будет неправильным элементом, указывающим на то, если base() дал вам итератор, указывающий на тот же элемент. Таким образом, он указывает один вперед, и вы можете использовать его для вставки.

  • Так как base() возвращает итератор, указывающий на другой элемент, это неправильный элемент для erase(). Если вы вызывали erase() на итераторе из base(), вы удаляли бы один элемент вперед в контейнере из элемента, на который указывает обратный итератор, поэтому вам нужно увеличить обратный итератор до вызова base(), чтобы получить правильный итератор вперед для использования erase().

  • Если вы даже можете использовать base() с erase(), чтобы правильно стереть элемент, это полностью зависит от вашей реализации. Он работает с gcc, но с Visual Studio они действительно просто переносят форвардный итератор таким образом, что он не работает, чтобы использовать erase() при работе с обратными итераторами и Visual Studio. Я не помню, имеет ли проблема insert() такая же проблема, но обратные итераторы не работают одинаково между различными реализациями С++ (согласно ребятам Visual Studio, стандарт был недостаточно ясен), поэтому он может быть добрым волосатого, чтобы использовать их для чего-то другого, кроме простое повторение контейнера.

Есть, вероятно, и другие проблемы, но, имея дело с любым типом итератора, отличным от неконстантного, форвардного итератора на С++, когда что-то другое, кроме простого итерации по контейнеру, может получить немного волосатое - если вы даже можете сделать все это - потому что для многих функций требуются итераторы, не являющиеся константными, а не любой другой итератор.

Если вы действительно хотите знать различия между различными типами итераторов и связанными с ними проблемами, я рекомендую прочитать Scott Meyer Effective STL. Он имеет большую главу об итераторах.

РЕДАКТИРОВАТЬ: Что касается того, как ускорить обратный итератор исправляет эти недостатки, я боюсь, что у меня нет подсказки. Я знаю некоторые из стандартных недостатков обратного итератора и был укушен ими в прошлом, но я никогда не использовал Boost, поэтому я не знаком с их обратными итераторами вообще. К сожалению.