Чтобы поддерживать представление STL о полуоткрытых диапазонах, нам разрешено указывать один на один конец массива. Предположим, что у нас есть вектор трех элементов. Если std::vector::iterator
реализуется как указатель, как это обычно бывает в версии сборки, то begin
и end
точка в этих странах:На что указывает точка?
+---+---+---+....
| | | | .
+---+---+---+....
^ ^
begin end
Где многоточия обозначают один-пришедшего к конечному псевдо-элемент. Поскольку нет такой вещи, как одно-до-начала, где точно должно было бы быть rend
? Позвольте мне проиллюстрировать:
+---+---+---+....
| | | | .
+---+---+---+....
^ ^
rend rbegin
Очевидно, что рисунок является неправильным, потому что rend
является незаконным указателем. Поэтому я предполагаю, что реализация std::vector::reverse_iterator
никогда не может быть указателем, даже в версиях.
Я прав? Какой был бы самый эффективный способ реализации reverse_iterator
?
В C, если указатель не указывает на объект или мимо последнего элемента объекта, и этот указатель получает оценку (не разыменовывается), поведение не определено. Этот вопрос касается C++, но я сомневаюсь, что там есть какая-то разница. Я думаю, вы должны уточнить, что вы имеете в виду: точки за пределами контейнера. – this 2015-10-31 22:13:53
@this: Имейте в виду, что вы говорите правду о * указателях *, но не обязательно о * итераторах *. Итераторы не всегда являются указателями. – 2015-10-31 23:10:15
Проблема, по моему мнению, состоит в том, что это даже не имеет значения, если вы не разыгрываете. Нам даже не разрешено выполнять арифметику указателя с или арифметикой, которая оценивается, указателем «один-на-начало». Таким образом, мы не можем просто создать указатель, указывающий перед началом массива, и сказать, что все в порядке, если мы его не разыскиваем, потому что действие его создания или использование его для измерения размера и т. Д. - это UB. Или я ошибаюсь? – 2017-05-25 19:42:00