Sí, los iteradores de entrada son iteradores de una pasada. Solo puede iterar sobre ellos una vez, mientras que los iteradores hacia adelante tienen múltiples pasadas.
De §24.2.3 [input.iterators] p2 (the table)
, columna pre-/postcondition de ++r
:
pre: r
es Dereferenceable.
publicación: r
es derivativo o r
es de extremo a extremo.
publicación: ya no se requiere ninguna copia del valor anterior de r
ya sea para ser referenciable o para estar en el dominio de ==
.
La última condición posterior implica que para a == b
, ++a == ++b
no está obligado a ser true
.
misma cláusula, párrafo 3:
[Nota: Para iteradores de entrada, a == b no implica ++ a == ++ b. (La igualdad no garantiza la propiedad de sustitución o la transparencia referencial.) Los algoritmos en los iteradores de entrada nunca deben intentar pasar dos veces por el mismo iterador. Deberían ser algoritmos de paso único. [...] Estos algoritmos se pueden usar con istremas como la fuente de los datos de entrada a través de la plantilla de clase istream_iterator
. -fin nota]
De §24.2.5 [forward.iterators]
p1 una clase o tipo de puntero X
satisface los requisitos de un iterador adelante si
- [...]
- objetos del tipo
X
ofrecen la garantía de múltiples pasos, que se describe a continuación.
p3 dos iteradores Dereferenceable ayb del tipo X
ofrecen la garantía de pasos múltiples si:
a == b
implica ++a == ++b
y
X
es un tipo de puntero o la expresión (void)++X(a), *a
es equivalente a la expresión *a
.
ejemplos típicos Así podrían ser una corriente iterador (un único paso, de entrada-iterador), y una lista de enlace simple (multi-pass iterador hacia adelante) – jalf
oh, por cierto, tienen un upboat. +1 – jalf