| 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.
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
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) |