Что является недостатками станд.:: reverse_iterator?

Документация для специализированных адаптеров итератора повышения указывает это boost::reverse_iterator "Исправляет многие недостатки станд. 98 C++:: reverse_iterator".

Каковы эти недостатки? Я, может казаться, не нахожу описание этих недостатков.

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

Как действительно повышает:: reverse_iterator исправляют эти недостатки?

18
задан Emile Cormier 8 July 2010 в 20:50
поделиться

1 ответ

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

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

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

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

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

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

Если вы действительно хотите узнать о различиях между различными типами итераторов и связанных с ними проблемах, я рекомендую прочитать Скотт Мейер Эффективный STL . В нем есть отличная глава об итераторах.

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

11
ответ дан 30 November 2019 в 09:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: