Поделиться через


span class (стандартная библиотека C++)

Предоставляет упрощенное представление по непрерывной последовательности объектов. A span обеспечивает безопасный способ итерации поверх и индексации в объекты, упорядоченные обратно в памяти. Например, объекты, хранящиеся в встроенном массиве, std::arrayили std::vector.

Если вы обычно обращаетесь к последовательности возвращаемых к спине объектов с помощью указателя и индекса, span это безопасная, упрощенная альтернатива.

Размер span можно задать во время компиляции, указав его в качестве аргумента шаблона или во время выполнения, dynamic_extentуказав.

Синтаксис

template<class T, size_t Extent = dynamic_extent>
class span;

Параметры шаблона

T
Тип элементов в span.

Extent
Количество элементов в заданном span во время компиляции. В противном случае std::dynamic_extent , если число элементов будет указано во время выполнения.

Руководство по вычету

Участники

Определения типов Description
const_pointer Тип указателя на const элемент.
const_reference Тип ссылки на const элемент.
difference_type Тип расстояния со знаком между двумя элементами.
element_type Тип span элемента.
iterator Тип итератора для объекта span.
pointer Тип указателя на элемент.
reference Тип ссылки на элемент.
reverse_iterator Тип обратного итератора для span.
size_type Тип для результата без знака расстояния между двумя элементами в элементе span.
value_type Тип элемента без const или volatile квалификации.
Конструктор Description
span Создайте span
Поддержка итератора Description
begin Получение итератора, указывающего на первый элемент в элементе span.
end Получение итератора, указывающего на конец span.
rbegin Получите обратный итератор, указывающий на последний элемент span; то есть начало обратного span.
rend Получите обратный итератор, указывающий на передний spanплан; то есть конец обратного span.
Элементы Access Description
back Получение последнего элемента в элементе span.
data Получение адреса первого элемента в элементе span.
front Получение первого элемента в элементе span.
operator[] Доступ к элементу в указанной позиции.
Наблюдателей Description
empty Проверьте, является ли пустой span .
size Получение количества элементов в элементе span.
size_bytes Получите размер span в байтах.
Вложенные представления Description
first Получите подсеть с передней spanчасти.
last Получите подсеть с задней spanстороны.
subspan Получение подспанея из любого места в span.
Операторы Description
span::operator= Замените span.
span::operator[] Получите элемент в указанной позиции.

Замечания

Все span функции-члены имеют постоянную сложность времени.

В отличие array от или vector, не span "владеет" элементами внутри него. Не span освобождает любое хранилище для элементов внутри него, так как оно не владеет хранилищем для этих объектов.

Требования

Заголовок: <span> (с C++20)

Пространство имен: std

Параметр компилятора: /std:c++20 или более поздней версии требуется.

span::back

Получение последнего элемента в элементе span.

constexpr reference back() const noexcept;

Возвращаемое значение

Ссылка на последний элемент в элементе span.

Пример

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);

    cout << mySpan.back();
}
2

span::begin

Получение итератора, указывающего на первый элемент в элементе span.

constexpr iterator begin() const noexcept;

Возвращаемое значение

Итератор, указывающий на первый элемент в элементе span.

Пример

#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

Получите указатель на начало span данных.

constexpr pointer data() const noexcept;

Возвращаемое значение

Указатель на первый элемент, хранящийся в элементе span.

Пример

#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

Число элементов между двумя элементами spanв .

using difference_type = std::ptrdiff_t;

Пример

#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

Тип элементов в span.

using element_type = T;

Замечания

Тип берется из параметра T шаблона при span создании.

Пример

#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

span Содержит ли элементы.

constexpr bool empty() const noexcept;

Возвращаемое значение

Возвращает значение true , если this->size() == 0. В противном случае — значение false.

Пример

#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

Получите итератор до конца span.

constexpr iterator end() const noexcept;

Возвращаемое значение

Итератор, указывающий только за конец span.

Замечания

end используется для проверки того, прошел ли итератор конец диапазона.

Не разыменовывайте значение, возвращаемое этим итератором. Используйте его для определения того, достиг ли итератор за пределами последнего элемента в элементе span.

Пример

// Iteration
for (auto it = s1.begin(); it != s1.end(); ++it)
{
    cout << *it;
}

span::first

Получите подспане, взятое с передней части этого span.

constexpr auto first(size_type count) const noexcept;
template <size_t count> constexpr auto first() const noexcept;

Параметры

count
Количество элементов с передней части этого span элемента, помещаемого в подпансе.
Число элементов указывается в качестве параметра шаблона или функции, как показано ниже.

Возвращаемое значение

Объект, span содержащий count элементы с передней части этого spanэлемента.

Замечания

Используйте версию шаблона этой функции, если это возможно, чтобы проверить count время компиляции и сохранить сведения о span том, как он возвращает фиксированный span экстент.

Пример

#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

Получение первого элемента в элементе span.

constexpr reference front() const noexcept;

Возвращаемое значение

Ссылка на первый элемент в элементе span.

Пример

#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

Тип iterator элементов над span элементами.

using iterator = implementation-defined-iterator-type;

Замечания

Этот тип служит в качестве iterator элемента в элементе span.

Пример

#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

Получите подспане, взятое из конца этого 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;

Параметры

count
Количество элементов из конца, span которые нужно поместить в подпане. Число можно указать в качестве параметра для шаблона или функции, как показано ниже.

Возвращаемое значение

Содержит span последние count элементы из этого spanэлемента.

Замечания

Используйте версию шаблона этой функции, если это возможно, чтобы проверить count время компиляции и сохранить сведения о span том, как он возвращает фиксированный span экстент.

Пример

#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[]

Получите элемент в span указанной позиции.

constexpr reference operator[](size_type offset) const;

Параметры

offset
Отсчитываемый от нуля элемент в доступе span .

Возвращаемое значение

Ссылка на элемент в позиции offset. Если позиция недопустима, поведение не определено.

Пример

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);
    cout << mySpan[1];
}
1

span::operator=

Назначьте другой span этому.

constexpr span& operator=(const span& other) noexcept = default;

Параметры

other
Назначение span этому объекту.

Возвращаемое значение

*this

Замечания

Назначение выполняет неглубокую копию указателя данных и размера. Неглубокая копия безопасна, так как span не выделяет память для содержащихся в нем элементов.

Пример

#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

Типы указателя и const указателя на span элемент.

using pointer = T*;
using const_pointer = const T*;

Пример

#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

Получите обратный итератор, указывающий на последний элемент этого spanэлемента.

constexpr reverse_iterator rbegin() const noexcept;

Возвращаемое значение

Итератор, указывающий на начало обратного span.

Пример

#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

Типы ссылок и const ссылки на span элемент.

using reference = T&;
using const_reference = const T&;

Пример

#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

Получите итератор случайного доступа, который указывает только после конца обратного span.

constexpr reverse_iterator rend() const noexcept;

Возвращаемое значение

Обратный итератор к заполнителю после последнего элемента в обратном span; то есть заполнитель перед первым элементом в неисследованном элементе span.

Замечания

rend используется с обратным span так же, как span::end используется с span. Используйте его для проверки того, достиг ли обратный итератор конца его span.

Возвращаемое rend значение не должно быть разоменовывано.

Пример

#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

Тип обратного итератора для span.

using reverse_iterator = std::reverse_iterator<iterator>;

Пример

#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

Получение количества элементов в элементе span.

constexpr size_t size() const noexcept;

Возвращаемое значение

Число элементов в массиве span.

Пример

#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

Получите размер элементов в span байтах.

constexpr size_type size_bytes() const noexcept;

Возвращаемое значение

Число байтов, которые все элементы в span занятых, то есть sizeof(element_type) умножены на число элементов в элементе span.

Пример

#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

Неподписанный тип, подходящий для хранения количества элементов в объекте span.

using size_type = size_t;

Пример

#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

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

Параметры

arr
span Создание из массива.

count
Число элементов, которые будут находиться в элементе span.

first
Итератор к первому элементу в элементе span.

last
Итератор только после последнего элемента в элементе span.

N
Число элементов, которые будут находиться в элементе span.

other
Сделайте копию этого span.

r
Создайте объект span из диапазона R.

Замечания

Не span освобождает хранилище для элементов в span нем, так как оно не владеет хранилищем объектов в нем.

Конструктор Description
span() Создание пустого span. Учитывается только во время разрешения перегрузки, если параметр Extent шаблона или 0 dynamic_extent.
span(It first, size_type count) span Создайте из первых count элементов из итератораfirst. Учитывается только во время разрешения перегрузки, если параметр Extent шаблона не dynamic_extentявляется.
span(It first, End last) span Создайте элемент из элементов в итераторе first до достижения концаlast. Учитывается только во время разрешения перегрузки, если параметр Extent шаблона не dynamic_extentявляется. It должен иметь тип contiguous_iterator.
span(array<T, N>& arr) noexcept;

span(const array<T, N>& arr) noexcept;

span(type_identity_t<element_type> (&arr)[N]) noexcept;
span Создайте из N элементов указанного массива. При разрешении Nперегрузки учитывается только в том случае, если параметр Extent шаблона равен dynamic_extent или равен.
span(R&& r) span Создание из диапазона. Только участвует в разрешении перегрузки, если параметр Extent шаблона не dynamic_extentявляется.
span(const span& other) Конструктор копирования, созданный компилятором. Неглубокая копия указателя данных безопасна, так как span не выделяет память для хранения элементов.
span(const span<OtherElementType, OtherExtent>& s) noexcept; Преобразование конструктора: создание из другого span span. Только принимает участие в разрешении перегрузки, если параметр Extent шаблона равен dynamic_extentили N dynamic_extent равен Extent.

Пример

#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

Получите подсеть этого 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

Параметры

count
Количество элементов, которые нужно поместить в подпане. Если count значение dynamic_extent равно (значение по умолчанию), то подпансеть берется с offset конца этого span.

offset
Расположение в этом span расположении для запуска подпане.

Возвращаемое значение

Начиная span с offset этого span. Содержит count элементы.

Замечания

Версия шаблона этой функции доступна, которая проверяет количество во время компиляции, которая сохраняет сведения о span ней, возвращая фиксированный span экстент.

Пример

#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

Тип элемента в элементе spanбез const или volatile квалификации.

using value_type = std::remove_cv_t<T>;

Пример

#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

Руководства по вычетам

Ниже приведены руководства по 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>>>;

См. также

<span>
Использование вычета аргументов шаблона класса