span
(Clase, Biblioteca estándar de C++)
Proporciona una vista ligera sobre una secuencia contigua de objetos. span
proporciona una manera segura de recorrer en iteración objetos organizados de forma consecutiva en la memoria y de indizarlos. Por ejemplo, los objetos almacenados en una matriz integrada, std::array
o std::vector
.
Si normalmente accede a una secuencia de objetos contiguos mediante un puntero y un índice, span
es una alternativa más segura y ligera.
El tamaño de span
se puede establecer en tiempo de compilación si se especifica como argumento de plantilla, o en tiempo de ejecución si se especifica dynamic_extent
.
Sintaxis
template<class T, size_t Extent = dynamic_extent>
class span;
Parámetros de plantilla
T
Tipo de los elementos de span
.
Extent
Número de elementos de span
si se especifica en tiempo de compilación. De lo contrario, std::dynamic_extent
si el número de elementos se va a especificar en tiempo de ejecución.
Miembros
Definiciones de tipos | Descripción |
---|---|
const_pointer |
Tipo de un puntero a un elemento de const . |
const_reference |
Tipo de una referencia a un elemento de const . |
difference_type |
El tipo de una distancia con signo entre dos elementos. |
element_type |
Tipo de un elemento de span . |
iterator |
Tipo de un iterador para span . |
pointer |
El tipo de un puntero a un elemento. |
reference |
El tipo de una referencia a un elemento. |
reverse_iterator |
Tipo de un iterador inverso para span . |
size_type |
Tipo del resultado de la distancia sin signo entre dos elementos de span . |
value_type |
Tipo de un elemento, sin calificaciones const o volatile . |
Constructor | Descripción |
span |
Construya un elemento span . |
Compatibilidad de iterador | Descripción |
begin |
Obtiene un iterador que apunta al primer elemento de span . |
end |
Obtiene un iterador que apunta al final de span . |
rbegin |
Obtiene un iterador inverso que apunta al último elemento de span ; es decir, el principio del objeto span inverso. |
rend |
Obtiene un iterador inverso que apunta al principio de span ; es decir, el final del objeto span inverso. |
Elementos de acceso | Descripción |
back |
Obtiene el último elemento de span . |
data |
Obtiene la dirección del primer elemento de span . |
front |
Obtiene el primer elemento de span . |
operator[] |
Accede a un elemento en una posición especificada. |
Observadores | Descripción |
empty |
Comprueba si el objeto span está vacío. |
size |
Obtiene el número de elementos de span . |
size_bytes |
Obtiene el tamaño de span en bytes. |
Subviews | Descripción |
first |
Obtiene un subintervalo del principio de span . |
last |
Obtiene un subintervalo del final de span . |
subspan |
Obtiene un subintervalo de cualquier lugar de span . |
Operadores | Descripción |
span::operator= |
Sustituye span . |
span::operator[] |
Obtiene el elemento que se encuentra en la posición especificada. |
Comentarios
Todas las funciones miembro de span
tienen complejidad de tiempo constante.
A diferencia de array
o vector
, span
no "posee" los elementos que contiene. span
no libera ningún almacenamiento para los elementos que contiene porque no posee el almacenamiento de esos objetos.
Requisitos
Encabezado: <span>
(desde C++20)
Espacio de nombres: std
Opción del compilador: /std:c++20
o posterior es necesaria.
span::back
Obtiene el último elemento de span
.
constexpr reference back() const noexcept;
Valor devuelto
Referencia al último elemento de span
.
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
cout << mySpan.back();
}
2
span::begin
Obtiene un iterador que apunta al primer elemento de span
.
constexpr iterator begin() const noexcept;
Valor devuelto
Iterador que apunta al primer elemento de span
.
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
auto i = mySpan.begin();
cout << *i;
}
0
span::data
Obtiene un puntero al principio de los datos de span
.
constexpr pointer data() const noexcept;
Valor devuelto
Puntero al primer elemento almacenado en span
.
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
auto i = mySpan.data();
cout << *i;
}
0
span::difference_type
Número de elementos entre dos elementos de span
.
using difference_type = std::ptrdiff_t;
Ejemplo
#include <span>
#include <iostream>
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
span<int>::difference_type distance = mySpan.end() - mySpan.begin();
cout << distance << std::endl;
}
3
span::element_type
Tipo de los elementos de span
.
using element_type = T;
Comentarios
El tipo se toma del parámetro de plantilla T
cuando se crea span
.
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
span<int>::element_type et = mySpan[2];
cout << et << endl;
}
2
span::empty
Si span
contiene elementos.
constexpr bool empty() const noexcept;
Valor devuelto
Devuelve true
si this->size() == 0
. De lo contrario, false
es .
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
bool isEmpty = mySpan.empty(); // isEmpty == false
}
span::end
Obtiene un iterador al final de span
.
constexpr iterator end() const noexcept;
Valor devuelto
Iterador que apunta justo después del final de span
.
Comentarios
end
se usa para probar si un iterador ha sobrepasado el final de su intervalo.
No deje de hacer referencia al valor devuelto por este iterador. Úselo para identificar si el iterador ha alcanzado un punto más allá del último elemento de span
.
Ejemplo
// Iteration
for (auto it = s1.begin(); it != s1.end(); ++it)
{
cout << *it;
}
span::first
Obtiene un subintervalo tomado del principio de span
.
constexpr auto first(size_type count) const noexcept;
template <size_t count> constexpr auto first() const noexcept;
Parámetros
count
Número de elementos del principio de span
que se van a colocar en el subintervalo.
El número de elementos se especifica como parámetro de la plantilla, o de la función, como se muestra a continuación.
Valor devuelto
span
que contiene count
elementos del principio de span
.
Comentarios
Use la versión de plantilla de esta función cuando sea posible para validar count
en tiempo de compilación y para conservar información sobre span
, ya que devuelve un objeto span
de extensión fija.
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
auto first2 = mySpan.first(2);
cout << "mySpan.first(2): ";
for (auto& i : first2)
{
cout << i;
}
cout << "\nmySpan.first<2>: ";
auto viewSpan = mySpan.first<2>();
for (auto& i : viewSpan)
{
cout << i;
}
}
mySpan.first(2): 01
mySpan.first<2>: 01
span::front
Obtiene el primer elemento de span
.
constexpr reference front() const noexcept;
Valor devuelto
Referencia al primer elemento de span
.
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
auto i = mySpan.front();
cout << i;
}
0
span::iterator
Tipo de un objeto iterator
sobre elementos de span
.
using iterator = implementation-defined-iterator-type;
Comentarios
Este tipo actúa como un objeto iterator
sobre los elementos de span
.
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
span<int>::iterator it = mySpan.begin();
cout << *it++ << *it++ << *it;
}
012
span::last
Obtiene un subintervalo tomado del final de span
.
constexpr span<element_type, dynamic_extent> last(const size_type count) const noexcept;
template <size_t count> constexpr span<element_type, count> last() const noexcept;
Parámetros
count
Número de elementos del final de span
que se van a colocar en el subintervalo.
El número se puede especificar como parámetro de la plantilla, o de la función, como se muestra a continuación.
Valor devuelto
span
que contiene los últimos count
elementos de este objeto span
.
Comentarios
Use la versión de plantilla de esta función cuando sea posible para validar count
en tiempo de compilación y para conservar información sobre span
, ya que devuelve un objeto span
de extensión fija.
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
auto first2 = mySpan.last(2);
cout << "mySpan.last(2): ";
for (auto& i : last2)
{
cout << i;
}
cout << "\nmySpan.last<2>: ";
auto viewSpan = mySpan.last<2>();
for (auto& i : viewSpan)
{
cout << i;
}
}
mySpan.last(2): 12
mySpan.last<2>: 12
span::operator[]
Obtiene el elemento de span
que se encuentra en una posición especificada.
constexpr reference operator[](size_type offset) const;
Parámetros
offset
Elemento basado en cero del objeto span
al que se va a acceder.
Valor devuelto
Referencia al elemento en la posición offset
. Si la posición no es válida, el comportamiento es indefinido.
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
cout << mySpan[1];
}
1
span::operator=
Asigne otro span
a este.
constexpr span& operator=(const span& other) noexcept = default;
Parámetros
other
span
que se va a asignar a este.
Valor devuelto
*this
Comentarios
La asignación realiza una copia superficial del puntero de datos y el tamaño. Una copia superficial es segura porque span
no asigna memoria para los elementos que contiene.
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
span<int> mySpan2;
mySpan2 = mySpan;
for (auto &i : mySpan2)
{
cout << it;
}
}
012
span::pointer
Tipos de un puntero y puntero const
a un elemento de span
.
using pointer = T*;
using const_pointer = const T*;
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
// pointer
span<int>::pointer ptr = &mySpan[2];
*ptr = 9;
cout << mySpan[2];
// const pointer
span<int>::const_pointer cPtr = &mySpan[0];
// *cPtr = 9; error - const
cout << *cPtr;
}
90
span::rbegin
Obtiene un iterador inverso que apunta al último elemento de span
.
constexpr reverse_iterator rbegin() const noexcept;
Valor devuelto
Iterador que apunta al principio del objeto span
inverso.
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
for (auto rIt = s1.rbegin(); rIt != s1.rend(); ++rIt)
{
cout << *rIt;
}
}
210
span::reference
Tipos de una referencia y referencia const
a un elemento de span
.
using reference = T&;
using const_reference = const T&;
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
// reference
span<int>::reference ref = mySpan[0];
ref = 9;
cout << mySpan[0];
// const reference
span<int>::const_reference cRef = mySpan[1];
// cRef = 9; error because const
cout << cRef;
}
91
span::rend
Obtiene un iterador de acceso aleatorio que apunta justo después del final del objeto span
inverso.
constexpr reverse_iterator rend() const noexcept;
Valor devuelto
Iterador inverso al marcador de posición que sigue al último elemento del objeto span
inverso; es decir, el marcador de posición situado antes del primer elemento del objeto span
sin invertir.
Comentarios
rend
se usa con un span
invertido igual que span::end
se usa con un span
. Úselo para comprobar si un iterador inverso ha llegado al final de su span
.
El valor devuelto por rend
no se debe desreferenciar.
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
for (auto rIt = s1.rbegin(); rIt != s1.rend(); ++rIt)
{
cout << *rIt;
}
}
span::reverse_iterator
Tipo de un iterador inverso para span
.
using reverse_iterator = std::reverse_iterator<iterator>;
Ejemplo
#include <span>
#include <iostream>
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
span<int>::reverse_iterator rIt = mySpan.rbegin();
cout << *rIt++ << *rIt++ << *rIt;
}
210
span::size
Obtiene el número de elementos de span
.
constexpr size_t size() const noexcept;
Valor devuelto
Número de elementos incluidos en span
.
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
cout << mySpan.size();
}
3
span::size_bytes
Obtiene el tamaño de los elementos de span
en bytes.
constexpr size_type size_bytes() const noexcept;
Valor devuelto
Número de bytes que ocupan todos los elementos de span
; es decir, sizeof(element_type)
multiplicado por el número de elementos de span
.
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
cout << mySpan.size_bytes(); // 3 elements * 4 (size of an int)
}
12
span::size_type
Tipo sin signo adecuado para almacenar el número de elementos de span
.
using size_type = size_t;
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
span<int>::size_type szType = mySpan.size();
cout << szType;
}
3
span::span
Constructores de span
.
constexpr span() noexcept
requires (Extent == 0 || Extent == dynamic_extent) = default;
template <class It>
constexpr explicit(Extent != dynamic_extent)
span(It first, size_type count) noexcept
template <class It, class End>
constexpr explicit(Extent != dynamic_extent)
span(It first, End last) noexcept(noexcept(last - first))
template <class T, size_t N>
requires (Extent == dynamic_extent || Extent == N) && is_convertible_v<T (*)[], T (*)[]>
constexpr span(array<T, N>& arr) noexcept
template <class T, size_t N>
requires (Extent == dynamic_extent || Extent == N) && is_convertible_v<const T (*)[], T (*)[]>
constexpr span(const array<T, N>& arr) noexcept
template <size_t N>
requires (Extent == dynamic_extent || Extent == N)
constexpr span(type_identity_t<T> (&arr)[N]) noexcept
template <class R>
constexpr explicit(Extent != dynamic_extent)
span(R&& r)
// default copy ctor
constexpr span(const span& other) noexcept = default;
// converting ctor
template <class T, size_t OtherExtent>
requires (Extent == dynamic_extent || OtherExtent == dynamic_extent ||
Extent == OtherExtent) && is_convertible_v<T (*)[], T (*)[]>
constexpr explicit(Extent != dynamic_extent && OtherExtent == dynamic_extent)
span(const span<T, OtherExtent>& other) noexcept
Parámetros
arr
Construye un objeto span
partir de una matriz.
count
Número de elementos que habrá en span
.
first
Iterador al primer elemento de span
.
last
Iterador justo después del último elemento de span
.
N
Número de elementos que habrá en span
.
other
Realiza una copia de span
.
r
Construye span
a partir del intervalo R
.
Comentarios
span
no libera almacenamiento para los elementos de span
porque no posee el almacenamiento de los objetos que contiene.
Constructor | Descripción |
---|---|
span() |
Construye un objeto span vacío. Solo se considera durante la resolución de una sobrecarga si el parámetro de plantilla Extent es 0 o dynamic_extent . |
span(It first, size_type count) |
Construye un objeto span a partir de los primeros count elementos del iterador first . Solo se considera durante la resolución de una sobrecarga si el parámetro de plantilla Extent no es dynamic_extent . |
span(It first, End last) |
Construye un objeto span a partir de los elementos del iterador first hasta que se alcanza el final de last . Solo se considera durante la resolución de una sobrecarga si el parámetro de plantilla Extent no es dynamic_extent . It debe ser contiguous_iterator . |
span(array<T, N>& arr) noexcept; span(const array<T, N>& arr) noexcept; span(type_identity_t<element_type> (&arr)[N]) noexcept; |
Construye un objeto span a partir de N elementos de la matriz especificada. Solo se considera durante la resolución de una sobrecarga si el parámetro de plantilla Extent es dynamic_extent o igual que N . |
span(R&& r) |
Construye un objeto span a partir de un intervalo. Solo participa en la resolución de una sobrecarga si el parámetro de plantilla Extent no es dynamic_extent . |
span(const span& other) |
Constructor de copia generado por el compilador. Una copia superficial del puntero de datos es segura porque span no asigna la memoria para contener los elementos. |
span(const span<OtherElementType, OtherExtent>& s) noexcept; |
Constructor de conversión: construye un objeto span a partir de otro span . Solo participa en la resolución de una sobrecarga si el parámetro de plantilla Extent es dynamic_extent , o N es dynamic_extent o igual que Extent . |
Ejemplo
#include <span>
using namespace std;
int main()
{
const int MAX=10;
int x[MAX];
for (int i = 0; i < MAX; i++)
{
x[i] = i;
}
span<int, MAX> span1{ x }; // fixed-size span: compiler error if size of x doesn't match template argument MAX
span<int> span2{ x }; // size is inferred from x
span<const int> span3 = span2; // converting constructor
span<int> span4( span2 ); // copy constructor
}
span::subspan
Obtiene un subintervalo de span
.
constexpr auto subspan(size_type offset, size_type count = dynamic_extent) const noexcept;
template <size_t offset, size_t count = dynamic_extent>
constexpr auto subspan() const noexcept
Parámetros
count
Número de elementos que se van a colocar en el subintervalo. Si count
es dynamic_extent
(el valor predeterminado), el subintervalo se toma de offset
, al final de span
.
offset
La ubicación en span
para iniciar el subintervalo.
Valor devuelto
span
a partir de offset
en span
. Contiene count
elementos.
Comentarios
Hay disponible una versión de plantilla de esta función que comprueba el recuento en tiempo de compilación, que conserva información sobre span
mediante la devolución de un objeto span
de extensión fija.
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
cout << "mySpan.subspan(1,2): ";
for (auto& i : mySpan.subspan(1,2))
{
cout << i;
}
cout << "\nmySpan.subspan<1,2>: ";
for (auto& i : mySpan.subspan<1,2>())
{
cout << i;
}
cout << "\nmySpan.subspan<1>: ";
for (auto& i : mySpan.subspan<1>)
{
cout << i;
}
}
mySpan.subspan(1,2): 12
mySpan.subspan<1,2>: 12
mySpan.subspan<1>: 12
span::value_type
Tipo del elemento en span
, sin calificaciones const
o volatile
.
using value_type = std::remove_cv_t<T>;
Ejemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
span<int>::value_type vType = mySpan[2];
cout << vType;
}
2
Guías de deducción
Se proporcionan las siguientes guías de deducción para span
.
// Allows the extent to be deduced from std::array and C++ built-in arrays
template <class T, size_t Extent>
span(T (&)[Extent]) -> span<T, Extent>;
template <class T, size_t Size>
span(array<T, Size>&) -> span<T, Size>;
template <class T, size_t Size>
span(const array<T, Size>&) -> span<const T, Size>;
// Allows the element type to be deduced from the iterator and the end of the span.
// The iterator must be contiguous
template <contiguous_iterator It, class End>
span(It, End) -> span<remove_reference_t<iter_reference_t<It>>>;
// Allows the element type to be deduced from a range.
// The range must be contiguous
template <ranges::contiguous_range Rng>
span(Rng &&) -> span<remove_reference_t<ranges::range_reference_t<Rng>>>;
Consulte también
<span>
Procedimiento para usar la deducción de argumentos de plantilla de clase