Espacios de nombres
Variantes
Acciones

std::forward_iterator

De cppreference.com
< cpp‎ | iterator
 
 
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
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]
close