Classe span
(Biblioteca Padrão C++)
Fornece uma exibição leve de uma sequência contígua de objetos. Um span
fornece uma maneira segura de iterar e indexar objetos que são organizados sequencialmente na memória. Isso é semelhante a objetos armazenados em uma matriz interna, std::array
ou std::vector
.
Se você normalmente acessa uma sequência de objetos sequenciais usando um ponteiro e um índice, um span
será uma alternativa mais segura e leve.
O tamanho de um span
pode ser definido em tempo de compilação especificando-o como um argumento de modelo ou em runtime especificando dynamic_extent
.
Sintaxe
template<class T, size_t Extent = dynamic_extent>
class span;
Parâmetros de modelo
T
O tipo dos elementos no span
.
Extent
O número de elementos no span
se especificado em tempo de compilação. Caso contrário, std::dynamic_extent
se o número de elementos for especificado em tempo de execução.
Membros
Definições de tipo | Descrição |
---|---|
const_pointer |
O tipo de um ponteiro para um elemento const . |
const_reference |
O tipo de uma referência a um elemento const . |
difference_type |
O tipo de uma distância com sinal entre dois elementos. |
element_type |
O tipo de um elemento span . |
iterator |
O tipo de um iterador para um span . |
pointer |
O tipo de um ponteiro para um elemento. |
reference |
O tipo de uma referência para um elemento. |
reverse_iterator |
O tipo de um iterador reverso para um span . |
size_type |
O tipo para o resultado da distância sem sinal entre dois elementos no span . |
value_type |
O tipo de um elemento, sem as qualificações const ou volatile . |
Construtor | Descrição |
span |
Construa um span . |
Suporte ao iterador | Descrição |
begin |
Obter um iterador que aponta para o primeiro elemento no span . |
end |
Obter um iterador que aponta para o final do span . |
rbegin |
Obter um iterador reverso que aponta para o último elemento do span ; ou seja, o início do span invertido. |
rend |
Obter um iterador reverso que aponta para a frente do span ; ou seja, o final do span invertido. |
Acessar elementos | Descrição |
back |
Obter o último elemento no span . |
data |
Obter o endereço do primeiro elemento no span . |
front |
Obter o primeiro elemento no span . |
operator[] |
Acessar um elemento em uma posição especificada. |
Observadores | Descrição |
empty |
Testar se o span está vazio. |
size |
Obter o número de elementos no span . |
size_bytes |
Obter o tamanho do span em bytes. |
Exibições secundárias | Descrição |
first |
Obter um intervalo secundário da frente do span . |
last |
Obter um intervalo secundário da parte de trás do span . |
subspan |
Obter um intervalo secundário de qualquer lugar no span . |
Operadores | Descrição |
span::operator= |
Substituir o span . |
span::operator[] |
Obter o elemento na posição especificada. |
Comentários
Todas as funções membro span
têm complexidade de tempo constante.
Diferente de array
ou vector
, um span
não é "proprietário" dos elementos dentro dele. Um span
não libera nenhum armazenamento para os itens dentro dele porque não é o proprietário do armazenamento desses objetos.
Requisitos
Cabeçalho: <span>
(desde C++20)
Namespace: std
Opção do compilador: /std:c++20
ou posterior é necessária.
span::back
Obter o último elemento no span
.
constexpr reference back() const noexcept;
Valor retornado
Uma referência ao último elemento no span
.
Exemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
cout << mySpan.back();
}
2
span::begin
Obter um iterador que aponta para o primeiro elemento no span
.
constexpr iterator begin() const noexcept;
Valor retornado
Um iterador que aponta para o primeiro elemento no span
.
Exemplo
#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
Obter um ponteiro para o início dos dados span
.
constexpr pointer data() const noexcept;
Valor retornado
Um ponteiro para o primeiro item armazenado no span
.
Exemplo
#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
O número de elementos entre dois elementos em um span
.
using difference_type = std::ptrdiff_t;
Exemplo
#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
O tipo dos elementos no span
.
using element_type = T;
Comentários
O tipo é obtido do parâmetro de modelo T
quando um span
é criado.
Exemplo
#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
Se o span
contém elementos.
constexpr bool empty() const noexcept;
Valor retornado
Retornará true
se this->size() == 0
. Caso contrário, false
.
Exemplo
#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
Obter um iterador para o final do span
.
constexpr iterator end() const noexcept;
Valor retornado
Um iterador que aponta para o fim do span
.
Comentários
end
é usado para testar se um iterador passou do fim de seu intervalo.
Não desreferencie o valor retornado por esse iterador. Use-o para identificar se o iterador foi além do último elemento no span
.
Exemplo
// Iteration
for (auto it = s1.begin(); it != s1.end(); ++it)
{
cout << *it;
}
span::first
Obter um intervalo secundário retirado da frente deste span
.
constexpr auto first(size_type count) const noexcept;
template <size_t count> constexpr auto first() const noexcept;
Parâmetros
count
O número de elementos da frente deste span
a serem colocados no intervalo secundário.
O número de elementos é especificado como um parâmetro para o modelo ou para a função, conforme ilustrado a seguir.
Valor retornado
Um span
que contém elementos count
da frente deste span
.
Comentários
Use a versão de modelo dessa função quando possível para validar o count
em tempo de compilação e preservar informações sobre o span
, uma vez que ele retorna um span
de extensão fixa.
Exemplo
#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
Obter o primeiro elemento no span
.
constexpr reference front() const noexcept;
Valor retornado
Uma referência para o primeiro elemento no span
.
Exemplo
#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
O tipo de um iterator
em elementos span
.
using iterator = implementation-defined-iterator-type;
Comentários
Esse tipo serve como um iterator
nos elementos em um span
.
Exemplo
#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
Obter um intervalo secundário retirado do final deste 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
O número de elementos do final deste span
a serem colocados no intervalo secundário.
O número pode ser especificado como um parâmetro para o modelo ou para a função, conforme ilustrado a seguir.
Valor retornado
Um span
que contém os últimos count
elementos deste span
.
Comentários
Use a versão de modelo dessa função quando possível para validar o count
em tempo de compilação e preservar informações sobre o span
, uma vez que ele retorna um span
de extensão fixa.
Exemplo
#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[]
Obter o elemento no span
em uma posição especificada.
constexpr reference operator[](size_type offset) const;
Parâmetros
offset
Elemento baseado em zero no span
a ser acessado.
Valor retornado
Uma referência ao elemento na posição offset
. Se a posição for inválida, o comportamento será indefinido.
Exemplo
#include <span>
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0,1,2 };
span<int> mySpan(a);
cout << mySpan[1];
}
1
span::operator=
Atribuir outro span
a este.
constexpr span& operator=(const span& other) noexcept = default;
Parâmetros
other
O span
a ser atribuído a este.
Valor retornado
*this
Comentários
A atribuição faz uma cópia superficial do ponteiro de dados e do tamanho. Uma cópia superficial é segura porque um span
não aloca memória para os elementos que contém.
Exemplo
#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
Os tipos de um ponteiro, e o ponteiro const
, para um elemento span
.
using pointer = T*;
using const_pointer = const T*;
Exemplo
#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
Obter um iterador reverso que aponta para o último elemento deste span
.
constexpr reverse_iterator rbegin() const noexcept;
Valor retornado
Um iterador que aponta para o início do span
invertido.
Exemplo
#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
Os tipos de uma referência, e uma referência const
, a um elemento span
.
using reference = T&;
using const_reference = const T&;
Exemplo
#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
Obter um iterador de acesso aleatório que aponta para além do fim do span
invertido.
constexpr reverse_iterator rend() const noexcept;
Valor retornado
Um iterador invertido para o espaço reservado seguindo o último elemento no span
invertido, ou seja, o espaço reservado antes do primeiro elemento no span
não invertido.
Comentários
rend
é usado com um span
invertido, assim como span::end
é usado com um span
. Use-o para testar se um iterador invertido alcançou o final de seu span
.
O valor retornado por rend
não deve ser desreferenciado.
Exemplo
#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
O tipo de um iterador reverso para um span
.
using reverse_iterator = std::reverse_iterator<iterator>;
Exemplo
#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
Obter o número de elementos no span
.
constexpr size_t size() const noexcept;
Valor retornado
O número de elementos em span
.
Exemplo
#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
Obter o tamanho dos elementos no span
em bytes.
constexpr size_type size_bytes() const noexcept;
Valor retornado
O número de bytes que todos os elementos em span
ocupam, ou seja, sizeof(element_type)
multiplicado pelo número de elementos em span
.
Exemplo
#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
Um tipo sem sinal, adequado para armazenar o número de elementos em um span
.
using size_type = size_t;
Exemplo
#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
Construtores 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
Construir um span
com base em uma matriz.
count
Número de elementos que estarão no span
.
first
Iterador até o primeiro elemento no span
.
last
Iterador até logo após o último elemento no span
.
N
O número de elementos que estarão no span
.
other
Fazer uma cópia deste span
.
r
Construir um span
com base no intervalo R
.
Comentários
Um span
não libera armazenamento para itens no span
porque não é proprietário do armazenamento dos objetos dentro dele.
Construtor | Descrição |
---|---|
span() |
Construir um span vazio. Considerado somente durante a resolução da sobrecarga quando o parâmetro de modelo Extent é 0 ou dynamic_extent . |
span(It first, size_type count) |
Construir um span com base nos primeiros elementos count do iterador first . Considerado somente durante a resolução da sobrecarga quando o parâmetro de modelo Extent não é dynamic_extent . |
span(It first, End last) |
Construir um span com base nos elementos no iterador first até que o final de last seja atingido. Considerado somente durante a resolução da sobrecarga quando o parâmetro de modelo Extent não é dynamic_extent . It deve ser um contiguous_iterator . |
span(array<T, N>& arr) noexcept; span(const array<T, N>& arr) noexcept; span(type_identity_t<element_type> (&arr)[N]) noexcept; |
Construir um span com base em elementos N da matriz especificada. Considerado somente durante a resolução da sobrecarga quando o parâmetro de modelo Extent ou dynamic_extent é igual a N . |
span(R&& r) |
Construir um span com base em um intervalo. Só participará da resolução da sobrecarga se o parâmetro de modelo Extent não for dynamic_extent . |
span(const span& other) |
O construtor de cópia gerado pelo compilador. Uma cópia superficial do ponteiro de dados é segura porque o span não aloca a memória para manter os elementos. |
span(const span<OtherElementType, OtherExtent>& s) noexcept; |
Construtor de conversão: construa um span com base em outro span . Só participará da resolução da sobrecarga se o parâmetro de modelo Extent for dynamic_extent , ou se N for dynamic_extent ou for igual a Extent . |
Exemplo
#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
Obter um intervalo secundário deste 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
O número de elementos a serem colocados no intervalo secundário. Se count
for dynamic_extent
(o valor padrão), o intervalo secundário será levado de offset
até o final deste span
.
offset
O local neste span
no qual iniciar o intervalo secundário.
Valor retornado
Um span
que começa em offset
neste span
. Contém elementos count
.
Comentários
Há uma versão de modelo dessa função que verifica a contagem em tempo de compilação, o que preserva informações sobre o span
retornando um span
com extensão fixa.
Exemplo
#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
O tipo do elemento no span
, sem as qualificações const
ou volatile
.
using value_type = std::remove_cv_t<T>;
Exemplo
#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
Guias de dedução
Os guias de dedução a seguir são fornecidos 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>>>;