Espacios de nombres
Variantes
Acciones

std::bidirectional_iterator

De cppreference.com
< cpp‎ | iterator
 
 
Biblioteca de iteradores
Conceptos de iteradores
bidirectional_iterator
(C++20)

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

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

[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

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