std:: span
|
Definido en el encabezado
<span>
|
||
|
template
<
class
T,
|
(desde C++20) | |
La plantilla de clase
span
describe un objeto que puede hacer referencia a una secuencia contigua de objetos con el primer elemento de la secuencia en la posición cero. Un
span
puede tener una extensión
static
, en cuyo caso el número de elementos en la secuencia se conoce en tiempo de compilación y está codificado en el tipo, o una extensión
dynamic
.
Para un
span
s
, los punteros, iteradores y referencias a elementos de
s
se invalidan cuando una operación invalida un puntero en el rango
[
s.
data
(
)
,
s.
data
(
)
+
s.
size
(
)
)
.
|
Toda especialización de
|
(desde C++23) |
Contenidos |
Parámetros de plantilla
| T | - | tipo de elemento; debe ser un tipo de objeto completo que no sea un tipo de clase abstracta |
| Extent | - |
el número de elementos en la secuencia, o
std::dynamic_extent
si es dinámico
|
Tipos anidados
| Tipo | Definición |
element_type
|
T
|
value_type
|
std:: remove_cv_t < T > |
size_type
|
std::size_t |
difference_type
|
std::ptrdiff_t |
pointer
|
T * |
const_pointer
|
const T * |
reference
|
T & |
const_reference
|
const T & |
iterator
[1]
|
definido por la implementación
LegacyRandomAccessIterator
,
ConstexprIterator
, y
contiguous_iterator
cuyo
value_type
es
value_type
|
const_iterator
(desde C++23)
|
std:: const_iterator < iterator > |
reverse_iterator
|
std:: reverse_iterator < iterator > |
const_reverse_iterator
(desde C++23)
|
std:: const_iterator < reverse_iterator > |
-
↑
iteratores un iterador mutable siTno está calificado como constante.
Todos los requisitos sobre los tipos de iteradores de un
Container
también se aplican al tipo
iterator
de
span
.
Miembros de datos
| Miembro | Descripción |
|
constexpr
std::
size_t
extent
[static]
|
Extent
(constante de miembro público estático) |
pointer
data_
|
un puntero a la secuencia subyacente
( objeto miembro solo para exposición* ) |
size_type
size_
(presente solo si el extent es dynamic ) |
el número de elementos
( objeto miembro solo para exposición* ) |
Funciones miembro
construye un
span
(función miembro pública) |
|
asigna un
span
(función miembro pública) |
|
|
(destructor)
(declarado implícitamente)
|
destruye un
span
(función miembro pública) |
Iteradores |
|
|
(C++23)
|
devuelve un iterador al inicio
(función miembro pública) |
|
(C++23)
|
devuelve un iterador al final
(función miembro pública) |
|
(C++23)
|
devuelve un iterador inverso al inicio
(función miembro pública) |
|
(C++23)
|
devuelve un iterador inverso al final
(función miembro pública) |
Acceso a elementos |
|
|
accede al primer elemento
(función miembro pública) |
|
|
accede al último elemento
(función miembro pública) |
|
|
(C++26)
|
accede al elemento especificado con verificación de límites
(función miembro pública) |
|
accede al elemento especificado
(función miembro pública) |
|
|
acceso directo al almacenamiento contiguo subyacente
(función miembro pública) |
|
Observadores |
|
|
devuelve el número de elementos
(función miembro pública) |
|
|
devuelve el tamaño de la secuencia en bytes
(función miembro pública) |
|
|
comprueba si la secuencia está vacía
(función miembro pública) |
|
Subvistas |
|
obtiene un subspan que consiste en los primeros
N
elementos de la secuencia
(función miembro pública) |
|
obtiene un subspan que consiste en los últimos
N
elementos de la secuencia
(función miembro pública) |
|
|
obtiene un subspan
(función miembro pública) |
|
Funciones no miembro
|
(C++20)
|
convierte un
span
en una vista de sus bytes subyacentes
(plantilla de función) |
Constante auxiliar
|
(C++20)
|
una constante de tipo
std::size_t
que indica que el
span
tiene extensión dinámica
(constante) |
Plantillas auxiliares
|
template
<
class
T,
std::
size_t
Extent
>
constexpr bool ranges:: enable_borrowed_range < std :: span < T, Extent >> = true ; |
(desde C++20) | |
Esta especialización de
ranges::enable_borrowed_range
hace que
span
satisfaga
borrowed_range
.
|
template
<
class
T,
std::
size_t
Extent
>
constexpr bool ranges:: enable_view < std :: span < T, Extent >> = true ; |
(desde C++20) | |
Esta especialización de
ranges::enable_view
hace que
span
cumpla con
view
.
Guías de deducción
Notas
Las especializaciones de
std::span
ya son tipos trivialmente copiables en todas las implementaciones existentes, incluso antes del requisito formal introducido en C++23.
| Macro de prueba de características | Valor | Estándar | Característica |
|---|---|---|---|
__cpp_lib_span
|
202002L
|
(C++20) |
std::span
|
202311L
|
(C++26) | std::span::at | |
__cpp_lib_span_initializer_list
|
202311L
|
(C++26) |
Construcción de
std::span
desde un
std::initializer_list
|
Ejemplo
El ejemplo utiliza
std::span
para implementar algunos algoritmos en rangos contiguos.
#include <algorithm> #include <cstddef> #include <iostream> #include <span> template<class T, std::size_t N> [[nodiscard]] constexpr auto slide(std::span<T, N> s, std::size_t offset, std::size_t width) { return s.subspan(offset, offset + width <= s.size() ? width : 0U); } template<class T, std::size_t N, std::size_t M> constexpr bool starts_with(std::span<T, N> data, std::span<T, M> prefix) { return data.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), data.begin()); } template<class T, std::size_t N, std::size_t M> constexpr bool ends_with(std::span<T, N> data, std::span<T, M> suffix) { return data.size() >= suffix.size() && std::equal(data.end() - suffix.size(), data.end(), suffix.end() - suffix.size()); } template<class T, std::size_t N, std::size_t M> constexpr bool contains(std::span<T, N> span, std::span<T, M> sub) { return std::ranges::search(span, sub).begin() != span.end(); } void println(const auto& seq) { for (const auto& elem : seq) std::cout << elem << ' '; std::cout << '\n'; } int main() { constexpr int a[]{0, 1, 2, 3, 4, 5, 6, 7, 8}; constexpr int b[]{8, 7, 6}; constexpr static std::size_t width{6}; for (std::size_t offset{}; ; ++offset) if (auto s = slide(std::span{a}, offset, width); !s.empty()) println(s); else break; static_assert("" && starts_with(std::span{a}, std::span{a, 4}) && starts_with(std::span{a + 1, 4}, std::span{a + 1, 3}) && !starts_with(std::span{a}, std::span{b}) && !starts_with(std::span{a, 8}, std::span{a + 1, 3}) && ends_with(std::span{a}, std::span{a + 6, 3}) && !ends_with(std::span{a}, std::span{a + 6, 2}) && contains(std::span{a}, std::span{a + 1, 4}) && !contains(std::span{a, 8}, std::span{a, 9}) ); }
Salida:
0 1 2 3 4 5 1 2 3 4 5 6 2 3 4 5 6 7 3 4 5 6 7 8
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Se aplica a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 3203 | C++20 |
no estaba claro cuándo se invalidaban los punteros, iteradores y
referencias a elementos de
span
|
aclarado |
| LWG 3903 | C++20 |
la declaración del destructor de
span
era innecesaria
|
eliminada la declaración |
| P2325R3 | C++20 |
un
span
de extensiones estáticas distintas de cero no era una
view
|
cualquier
span
es una
view
|
Véase también
|
(C++23)
|
una vista de arreglo multidimensional que no posee los datos
(plantilla de clase) |
|
(C++20)
|
combina un par iterador-sentinel en una
view
(plantilla de clase) |
|
(C++11)
|
referencia un arreglo temporal creado en
list-initialization
(plantilla de clase) |
|
(C++17)
|
vista de cadena de solo lectura
(plantilla de clase) |