std::bidirectional_iterator
Definido en el archivo de encabezado <iterator>
|
||
template<class I> concept bidirectional_iterator = |
(desde C++20) | |
El concepto bidirectional_iterator
es un refinamiento de forward_iterator
que agrega, agregando la habilidad de que un iterador pueda retroceder.
Contenido |
[editar] Determinación del concepto de iterador
La definición de este concepto se especifica mediante una plantilla de alias de solo exposición /*CONCEPTO_ITER*/.
Para determinar /*CONCEPTO_ITER*/<I>, dejemos que RASGOS_ITER<I> denote I si la especialización std::iterator_traits<I> se genera a partir de la plantilla principal, o std::iterator_traits<I> de lo contrario:
- Si RASGOS_ITER<I>::iterator_concept es válido y nombra un tipo, /*CONCEPTO_ITER*/<I> denota el tipo.
- De lo contrario, si RASGOS_ITER<I>::iterator_category es válido y nombra un tipo, /*CONCEPTO_ITER*/<I> denota el tipo.
- De lo contrario, si std::iterator_traits <I> se genera a partir de la plantilla principal, /*CONCEPTO_ITER*/<I> denota std::random_access_iterator_tag.
- De lo contrario, /*CONCEPTO_ITER*/<I> no denota un tipo y da como resultado un error de sustitución.
[editar] Requerimientos semánticos
Se dice que un iterador bidireccional r
es decrementable si y solo si existe alguna s
tal que ++s == r.
Se modela bidirectional_iterator<I>
solo si se modelan todos los conceptos que subsume, y dados dos objetos a
y b
de tipo I
:
- Si
a
es decrementable,a
se encuentra en el dominio de las expresiones --a y a--. - El predecremento produce un l-valor que se refiere al operando: std::addressof(--a) == std::addressof(a);
- El posdecremento produce el valor anterior del operando: si bool(a == b), entonces bool(a-- == b).
- El posdecremento y el predecremento realizan la misma modificación en su operando: si bool(a == b), entonces, después de evaluar tanto a
a--
como a--b
, bool(a == b) todavía se mantiene. - Incrementar y decrementar son inversos el uno del otro:
- Si
a
es incrementable y bool(a == b), entonces bool(--(++a) == b). - Si
a
es decrementable y bool(a == b), entonces bool(++(--a) == b).
- Si
[editar] Conservación de la igualdad
Una expresión es conservadora de igualdad si resulta en salidas iguales dadas entradas iguales.
- Las entradas de una expresión consisten en sus operandos.
- Las salidas de una expresión consisten en su resultado y todos los operandos modificados por la expresión (si es que los hay).
Cada expresión que se requiere sea conservadora de igualdad, se requiere además que sea estable: dos evaluaciones de tal expresión con los mismos objetos de entrada debe tener salidas iguales si no se encuentra alguna modificación interventora de esos objetos de entrada.
A menos que se indique de otra manera, cada expresión utilizada en una expresión-requiere se requiere sea conservadora de igualdad y estable, y la evaluación de la expresión puede solamente modificar sus operandos no constantes. Los operandos que son constantes no deben ser modificados.
[editar] Notas
A diferencia de los requerimientos de BidirectionalIterator el concepto bidirectional_iterator
no requiere desreferenciación para devolver un l-valor.
[editar] 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) |