Espacios de nombres
Variantes
Acciones

std::span

De cppreference.com
< cpp‎ | container
 
 
 
 
Definido en el archivo de encabezado <span>
template<

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

>class span;
(desde C++20)

La plantilla de clase span o lapso describe un objeto que puede referirse a una secuencia contigua de objetos con el primer elemento de la secuencia en la posición cero. Un lapso (span) puede tener ya sea un alcance (extent) estático, en cuyo caso el número de elementos en la secuencia se conoce y está codificado en el tipo, o un alcance dinámico.

Si un span tiene un alcance dinámico, una implementación típica mantiene solamente dos miembros: un puntero a T y un tamaño. Un span con un alcance estático puede tener solamente un miembro: un puntero a T.

Toda especialización de std::span es un tipo TriviallyCopyable.

(desde C++23)

Contenido

[editar]Parámetros de plantilla

T - Tipo de elemento; debe ser un tipo completo que no es un tipo de clase abstracta.
Extent - El número de elementos en la secuencia, o std::dynamic_extent si es dinámico.

[editar]Tipos miembro

Tipo miembro Definición
element_typeT
value_typestd::remove_cv_t<T>
size_typestd::size_t
difference_typestd::ptrdiff_t
pointerT*
const_pointerconst T*
referenceT&
const_referenceconst T&
iteratorRandomAccessIterator definido por la implementación, ConstexprIterator, y contiguous_iterator cuyo value_type es value_type
reverse_iteratorstd::reverse_iterator<iterator>

Nota: iterator es un iterador mutable si T no está calificado const.

Todos los requerimientos de los tipos de iterador de un Container también se aplican al tipo iterator de span.

[editar]Constante miembro

staticconstexprstd::size_t extent = Extent;

[editar]Funciones miembro

Construye un lapso (span).
(función miembro pública)[editar]
Asigna un lapso.
(función miembro pública)[editar]
Iteradores
(C++20)
Devuelve un iterador al principio.
(función miembro pública)[editar]
(C++20)
Devuelve un iterador al final.
(función miembro pública)[editar]
(C++20)
Devuelve un iterador inverso al principio.
(función miembro pública)[editar]
Devuelve un iterador inverso al final.
(función miembro pública)[editar]
Acceso a elementos
(C++20)
Accede al primer elemento.
(función miembro pública)[editar]
(C++20)
Accede al último elemento.
(función miembro pública)[editar]
Accede a un elemento de la secuencia.
(función miembro pública)[editar]
Devuelve un puntero al inicio de la secuencia de elementos.
(función miembro pública)[editar]
Observadores
Devuelve el número de elementos en la secuencia.
(función miembro pública)[editar]
Devuelve el tamaño de la secuencia en bytes.
(función miembro pública)[editar]
Comprueba si la secuencia está vacía
(función miembro pública)[editar]
Subvistas
Obtiene un sublapso que consiste en los primeros N elementos de la secuencia.
(función miembro pública)[editar]
Obtiene un sublapso que consiste en los últimos N elementos de la secuencia.
(función miembro pública)[editar]
Obtiene un sublapso.
(función miembro pública)[editar]

[editar]Funciones no miembro

Convierte un lapso (span) en una vista de sus bytes subyacentes.
(plantilla de función)[editar]

[editar]Constante no miembro

Una constante de tipo size_t que significa que el lapso tiene alcance dinámico.
(constante)[editar]

[editar]Plantillas auxiliares

template<class T, std::size_t Extent>
inlineconstexprboolranges::enable_borrowed_range<std::span<T, Extent>>=true;

Esta especialización de ranges::enable_borrowed_range hace que un lapso (span) satisfaga a borrowed_range.

template<class T, std::size_t Extent>
inlineconstexprboolranges::enable_view<std::span<T, Extent>>=true;

Esta especialización de ranges::enable_view hace que un lapso (span) satisfaga a view.

[editar]Guías de deducción

[editar]Notas

Las especializaciones de std::span ya son tipos trivialmente copiables en todas las implementaciones en existencia, incluso antes de que se introdujera el requerimiento formal en C++23.

[editar]Ejemplo

El ejemplo usa 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]]constexprauto 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>[[nodiscard]]constexprbool 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>[[nodiscard]]constexprbool 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>[[nodiscard]]constexprbool contains(std::span<T,N> span, std::span<T,M> sub){returnstd::search(span.begin(), span.end(), sub.begin(), sub.end())!= span.end();// return std::ranges::search(span, sub).begin() != span.end();}   void print(constauto& seq){for(constauto& elem : seq)std::cout<< elem <<' ';std::cout<<'\n';}   int main(){constexprint a[]{0, 1, 2, 3, 4, 5, 6, 7, 8};constexprint b[]{8, 7, 6};   for(std::size_t offset{};;++offset){constexprstd::size_t width{6};auto s = slide(std::span{a}, offset, width);if(s.empty())break; print(s);}   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

[editar]Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
P2325R3 C++20 Los span de alcance estático distinto de cero no eran una vista (view) Lo son, ya que default_initializable no se requiere.

[editar]Véase también

Permite el uso de la sintaxis de inicialización de lista para inicializar tipos de datos no simples (plain-old data types).
(plantilla de clase)[editar]
Vista sobre cadena de solo lectura.
(plantilla de clase)[editar]
Combina un par iterador-centinela en una vista (view).
(plantilla de clase)[editar]
close