Чтобы поддерживать STL-представление полуоткрытых диапазонов, нам разрешено указывать один-на-конец массива. Предположим, что у нас есть вектор трех элементов. Если std::vector::iterator
реализуется как указатель, как это обычно бывает в релиз-сборках, то begin
и end
указывают на следующие местоположения:
+---+---+---+....
| | | | .
+---+---+---+....
^ ^
begin end
В тех случаях, когда точки обозначают псевдоэлемент, прошедший один конец. Так как нет такой вещи, как одно-до-начала, где именно rend
указывает? Позвольте мне проиллюстрировать:
+---+---+---+....
| | | | .
+---+---+---+....
^ ^
rend rbegin
Ясно, что иллюстрация неверна, потому что rend
является незаконным указателем. Поэтому я предполагаю, что реализация std::vector::reverse_iterator
никогда не может быть указателем, даже в версиях.
Я прав? Каким будет наиболее эффективный способ реализации reverse_iterator
тогда?