Para admitir la noción de STL de rangos semiabiertos, se nos permite señalar uno más allá de una matriz. Supongamos que tenemos un vector de tres elementos. Si std::vector::iterator
se implementa como un puntero, como suele ser el caso en las versiones de lanzamiento, a continuación, begin
y end
punto a estas ubicaciones:¿A dónde apunta el rend?
+---+---+---+....
| | | | .
+---+---+---+....
^ ^
begin end
donde los puntos denotan el pseudo-elemento de una sola past-the-final. Dado que no existe tal cosa como un one-before-the-beginning, ¿dónde exactamente podría indicar rend
? Permítanme ilustrar:
+---+---+---+....
| | | | .
+---+---+---+....
^ ^
rend rbegin
Claramente, la ilustración es malo, porque rend
es un puntero ilegal. Así que supongo que la implementación de std::vector::reverse_iterator
nunca puede ser un puntero, incluso en compilaciones de versiones.
¿Estoy en lo cierto? Entonces, ¿cuál sería la forma más eficiente de implementar reverse_iterator
?
En C, si un puntero no señala a un objeto o un objeto pasado el último elemento, y ese puntero se evalúa (no desreferencia), el comportamiento no está definido. Esta pregunta es sobre C++, pero dudo que haya alguna diferencia allí. Creo que debes aclarar a qué te refieres con: puntos fuera del contenedor. – this
@this: tenga en cuenta que lo que dice es cierto sobre * punteros *, pero no necesariamente sobre * iteradores *. Los iteradores no siempre son indicadores. –
El problema, a mi entender, es que ni siquiera importa si no desreferencia. Ni siquiera podemos ejecutar aritmética de puntero con, o aritmética que evalúa, un puntero 'one-before-the-beginning'. Por lo tanto, no podemos simplemente crear un puntero que apunte antes del comienzo de una matriz y decir que está bien, siempre que no lo desreferenciamos, porque el acto de crearlo o usarlo para medir el tamaño, etc., es UB. ¿O estoy equivocado? –