Espacios de nombres
Variantes

std::bidirectional_iterator

De cppreference.com
 
 
Biblioteca de iteradores
Conceptos de iteradores
Primitivas de iteradores
Conceptos de algoritmos y servicios
Conceptos invocables indirectos
Requerimientos comunes de algoritmos
Servicios
Adaptadores de iteradores
Iteradores de flujos
Puntos de personalización de iteradores
Operaciones de iteradores
(C++11)
(C++11)
Acceso a rangos
(C++11)(C++14)
(C++11)(C++14)
(C++17)(C++20)
(C++14)(C++14)
(C++14)(C++14)
(C++17)
(C++17)
 
<tbody> </tbody>
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_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.

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

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

Especifica que un input_iterator es un iterador de avance, que admite la comparación de igualdad y múltiples pasadas.
(concepto) [editar]