std::contiguous_iterator
Definido en el archivo de encabezado <iterator> | ||
template<class I> concept contiguous_iterator = | (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:
- std::to_address(a)==std::addressof(*a),
- std::to_address(b)==std::to_address(a)+std::iter_difference_t<I>(b - a), y
- std::to_address(c)==std::to_address(a)+std::iter_difference_t<I>(c - a).
[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
(C++20) | Especifica que un bidirectional_iterator es un iterador de acceso aleatorio, que admite el avance en tiempo constante y acceso de subíndice. (concepto) |