Espacios de nombres
Variantes
Acciones

std::contiguous_iterator

De cppreference.com
< cpp‎ | iterator
 
 
Biblioteca de iteradores
Conceptos de iteradores
contiguous_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
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 contiguous_iterator =
    std::random_access_iterator<I>&&
    std::derived_from</*CONCEPTO_ITER*/<I>, std::contiguous_iterator_tag>&&
    std::is_lvalue_reference_v<std::iter_reference_t<I>>&&
    std::same_as<
      std::iter_value_t<I>, std::remove_cvref_t<std::iter_reference_t<I>>
    >&&
    requires(const I& i){
      {std::to_address(i)}->
        std::same_as<std::add_pointer_t<std::iter_reference_t<I>>>;

    };
(desde C++20)

El concepto contiguous_iterator es un refinamiento de random_access_iterator que proporciona una garantía que los elementos denotados se almacenan de manera contigua en la memoria.

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

Sean a y b iteradores desreferenciables y c sea un iterador no desreferenciable de tipo I tal que b puede alcanzarse desde a y c es puede alcanzarse desde b. El tipo I modela contiguous_iterator solo si todos los conceptos que subsume se modelan, y:

[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]Variaciones de expresión implícita

Una expresión-requiere que usa una expresión que no es modificable para algún operando l-valor constante también requiere implícitamente variaciones adicionales de esa expresión que acepten un l-valor no constante o un r-valor (posiblemente constante) para el operando dado, a menos que tal variación de expresión se requiera explícitamente con semánticas discrepantes. Estas variaciones de expresión implícita deben cumplir con los mismos requerimientos semánticos de la expresión declarada. No se especifica hasta qué punto una implementación valida la sintaxis de las variaciones.

[editar]Notas

contiguous_iterator se modela por todo tipo puntero a un tipo objeto completo.

A los tipos iterador en la biblioteca estándar que se les requiere que satisfagan los requerimientos de ContiguousIterator en C++17 también se les requiere que modelen contiguous_iterator en C++20.

[editar]Véase también

Especifica que un bidirectional_iterator es un iterador de acceso aleatorio, que admite el avance en tiempo constante y acceso de subíndice.
(concepto)[editar]
close