2012-01-15 8 views
12

¿Cuál es la diferencia entre los iteradores de entrada y los iteradores de solo lectura hacia adelante?¿Cuál es la diferencia entre los iteradores de entrada y los iteradores de solo lectura hacia adelante?

Como estos últimos son de solo lectura, obviamente no satisfacen los requisitos de los iteradores de salida. Y, debido a eso, son efectivamente iteradores de entrada con garantías adicionales (si las hay). El problema es, ¿qué garantías adicionales?

Supongo que los iteradores hacia delante son de múltiples pasos y los iteradores de entrada no, ¿verdad?

Respuesta

20

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.
+5

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

+0

oh, por cierto, tienen un upboat. +1 – jalf

Cuestiones relacionadas