Ответ 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, поэтому я не знаком с их обратными итераторами вообще. К сожалению.