Requisitos denominados de C++: IteradorDeAvanceLegado
Un IteradorDeAvanceLegado es un IteradorLegado que puede leer datos del elemento al que se apunta.
A diferencia de un IteradorDeEntradaLegado y un IteradorDeSalidaLegado, puede usarse en algoritmos de múltiples pasadas.
Si un IteradorDeAvanceLegado it se origina a partir de un Contenedor, entonces el tipo de valor de it es el mismo que el del contenedor, por lo que al referenciar (*it) se obtiene el tipo de valor del contenedor.
Requisitos
| Tipo | Definición |
X
|
Un tipo iterador de avance |
T
|
El tipo valor de X (por ejemplo, std::iterator_traits<X>::value_type)
|
Ref
|
std::iterator_traits<X>::reference
|
| Valor | Definición |
i, j
|
Valores de tipo X o const X
|
r
|
Un valor de tipo X&
|
X satisface a IteradorDeAvanceLegado si se satisfacen todas las condiciones siguientes:
Xsatisface a IteradorDeEntradaLegado.Xsatisface a ConstruiblePorDefecto.- Si
Xes un iterador mutable,Refes una referencia aT. - Si
Xes un iterador constante,Refes una referencia aconst T. - Objetos del tipo
Xproporcionan garantía de múltiples pasadas. - Si
iyjson iguales, entoncesiyjson ambos dereferenciables o ninguno de ellos los es. - Si
iyjson desreferenciables, entoncesi == jsi y solo si*iy*jestán enlazados al mismo objeto. - Las siguientes expresiones deben ser válidas y tener los efectos especificados:
| Expresión | Tipo | Efectos |
|---|---|---|
r++
|
convertible a const X&
|
Equivalente a X x = r;++r;return x;.
|
*i++
|
Ref
|
Dominio de la igualdad
El dominio de == para iteradores de avance es el de los iteradores sobre la misma secuencia subyacente.
|
Sin embargo, los iteradores de avance inicializados por valor se pueden comparar, y deben compararse igual a otros iteradores inicializados por valor del mismo tipo. En otras palabra, los iteradores de avance inicializados por valor se comportan como si hicieran referencia más allá del final de la misma secuencia vacía. |
(desde C++14) |
Garantía de múltiples pasadas
Dos iteradores desreferenciables, a y b de tipo X ofrecen garantía de múltiples pasadas si se satisfacen todas las condiciones siguientes:
a == bimplica++a == ++b.- Cualquiera de las condiciones siguientes se satisface:
Xes un tipo puntero.- La expresión
(void)++X(a), *aes equivalente a la expresión*a.
ConceptoPara la definición de std::iterator_traits, se define el siguiente concepto solo para exposición. <tbody> </tbody>
donde el concepto solo para exposición |
(desde C++20) |
Notas
Al contrario del concepto std::forward_iterator, los requisitos de IteradorDeAvanceLegado requieren una desreferencia para devolver una referencia.
Informes de defectoss
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| N3066 | C++98 | el tipo de *i++ no coincide con el tipo de*i-- requerido por IteradorBidireccionalLegado
|
cambió el tipo a Ref
|
| N3066 | C++98 | “a == b implica ++a == ++b” por sí solono ofrecía garantía multipaso[1] |
también se requiere “a == bimplica ++a != b”[2]
|
| LWG 3798 | C++20 | se requiere que __LegacyForwardIterator std::iter_reference_t<It>sea un tipo de referencia a l-valor |
También se permiten tipos referencia a r-valor |
Véase también
(C++20) |
Especifica que un input_iterator es un iterador de avance, que admite la comparación de igualdad y múltiples pasadas. (concepto) |
| Biblioteca de iteradores | Proporciona definiciones para iteradores, rasgos de iteradores, adaptadores y funciones de servicio. |