std::bidirectional_iterator
| Definido en el archivo de encabezado <iterator>
|
||
template<class I> concept bidirectional_iterator = std::forward_iterator<I> && std::derived_from</*CONCEPTO_ITER*/<I>, std::bidirectional_iterator_tag> && requires(I i) { { --i } -> std::same_as<I&>; { i-- } -> std::same_as<I>; }; |
(desde C++20) | |
El concepto bidirectional_iterator es un refinamiento de forward_iterator que agrega, agregando la habilidad de que un iterador pueda retroceder.
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_conceptes válido y nombra un tipo,/*CONCEPTO_ITER*/<I>denota el tipo. - De lo contrario, si
RASGOS_ITER<I>::iterator_categoryes 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.
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
aes decrementable,ase encuentra en el dominio de las expresiones--aya--. - 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), entoncesbool(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 aa--como a--b,bool(a == b)todavía se mantiene. - Incrementar y decrementar son inversos el uno del otro:
- Si
aes incrementable ybool(a == b), entoncesbool(--(++a) == b). - Si
aes decrementable ybool(a == b), entoncesbool(++(--a) == b).
- Si
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.
Notas
A diferencia de los requerimientos de BidirectionalIterator el concepto bidirectional_iterator no requiere desreferenciación para devolver un l-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) |