Namespaces
Variants

std:: span

From cppreference.net
Definido en el encabezado <span>
template <

class T,
std:: size_t Extent = std:: dynamic_extent

> class span ;
(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 std::span es un tipo TriviallyCopyable .

(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 >
  1. iterator es un iterador mutable si T no 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
devuelve un iterador al inicio
(función miembro pública)
(C++23)
devuelve un iterador al final
(función miembro pública)
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

convierte un span en una vista de sus bytes subyacentes
(plantilla de función)

Constante auxiliar

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)
combina un par iterador-sentinel en una view
(plantilla de clase)
referencia un arreglo temporal creado en list-initialization
(plantilla de clase)
vista de cadena de solo lectura
(plantilla de clase)