Espacios de nombres
Variantes
Acciones

std::forward_iterator

De cppreference.com
< cpp‎ | iterator
 
 
Biblioteca de iteradores
Conceptos de iteradores
forward_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 forward_iterator =
    std::input_iterator<I> &&
    std::derived_from</*CONCEPTO_ITER*/<I>, std::forward_iterator_tag> &&
    std::incrementable<I> &&

    std::sentinel_for<I, I>;
(desde C++20)

El concepto forward_iterator es un refinamiento de std::input_iterator requiriendo que I también modele std::incrementable (lo que lo hace adecuado para algoritmos de múltiples pasadas), y garantizando que dos iteradores del mismo rango se puedan comparar entre sí.

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] Requisitos semánticos

I modela std::forward_iterator si, y solo si I modela todos los conceptos que subsume, y dados los objetos i y j de tipo I:

  • La comparación entre los iteradores i y j tiene un resultado definido si
  • i y j son iteradores a la misma secuencia subyacente, o
  • tanto i como j son inicializados por valor, en cuyo caso se comparan iguales.
  • Los punteros y las referencias obtenidas a partir de un iterador de avance siguen siendo válido mientras exista el rango.
  • Si i y j son desreferenciables, ofrecen la garantía de múltiples pasadas, es decir:
  • i == j implica ++i == ++j, y
  • ((void)[](auto x){ ++x; }(i), *i) es equivalente a *i.

[editar] Notas

A diferencia de los requisitos de ForwardIterator, el concepto forward_iterator no requiere desreferenciabilidad para devolver un l-valor.

[editar] Véase también

Especifica que un tipo es un iterador de entrada. Es decir, sus valores referenciados pueden leerse y ser tanto preincrementados como posincrementados.
(concepto) [editar]