Partilhar via


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::arrayou 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.

Guia de deduçã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>>>;

Confira também

<span>
Como usar a dedução de argumento de modelo de classe