Namespaces
Variants

std:: span

From cppreference.net
Определено в заголовочном файле <span>
template <

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

> class span ;
(начиная с C++20)

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

Для span s указатели, итераторы и ссылки на элементы s становятся недействительными, когда операция инвалидирует указатель в диапазоне [ s. data ( ) , s. data ( ) + s. size ( ) ) .

Каждая специализация std::span является типом TriviallyCopyable .

(начиная с C++23)

Содержание

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

T - тип элемента; должен быть полным типом объекта, не являющимся абстрактным классом
Extent - количество элементов в последовательности, или std::dynamic_extent если динамическое

Вложенные типы

Тип Определение
element_type T
value_type std:: remove_cv_t < T >
size_type std::size_t
difference_type std::ptrdiff_t
pointer T *
const_pointer const T *
reference T &
const_reference const T &
iterator [1] определяемый реализацией LegacyRandomAccessIterator , ConstexprIterator , и contiguous_iterator , чей value_type является value_type
const_iterator (начиная с C++23) std:: const_iterator < iterator >
reverse_iterator std:: reverse_iterator < iterator >
const_reverse_iterator (начиная с C++23) std:: const_iterator < reverse_iterator >
  1. iterator является изменяемым итератором, если T не квалифицирован как const.

Все требования к типам итераторов для Container также применяются к типу iterator в span .

Члены данных

Участник Описание
constexpr std:: size_t extent
[static]
Extent
(публичная статическая константа-член)
pointer data_ указатель на базовую последовательность
( объект-член только для демонстрации* )
size_type size_
(присутствует только если extent является dynamic  )
количество элементов
( объект-член только для демонстрации* )

Функции-члены

создаёт span
(public member function)
присваивает span
(public member function)
(destructor)
(implicitly declared)
уничтожает span
(public member function)
Итераторы
возвращает итератор на начало
(public member function)
(C++23)
возвращает итератор на конец
(public member function)
возвращает обратный итератор на начало
(public member function)
(C++23)
возвращает обратный итератор на конец
(public member function)
Доступ к элементам
доступ к первому элементу
(public member function)
доступ к последнему элементу
(public member function)
(C++26)
доступ к указанному элементу с проверкой границ
(public member function)
доступ к указанному элементу
(public member function)
прямой доступ к базовому непрерывному хранилищу
(public member function)
Наблюдатели
возвращает количество элементов
(public member function)
возвращает размер последовательности в байтах
(public member function)
проверяет, пуста ли последовательность
(public member function)
Подпредставления
получает подпредставление из первых N элементов последовательности
(public member function)
получает подпредставление из последних N элементов последовательности
(public member function)
получает подпредставление
(public member function)

Функции, не являющиеся членами класса

преобразует span в представление его базовых байтов
(шаблон функции)

Вспомогательная константа

константа типа std::size_t обозначающая, что span имеет динамический размер
(константа)

Вспомогательные шаблоны

template < class T, std:: size_t Extent >
constexpr bool ranges:: enable_borrowed_range < std :: span < T, Extent >> = true ;
(начиная с C++20)

Эта специализация ranges::enable_borrowed_range позволяет span удовлетворять требованиям borrowed_range .

template < class T, std:: size_t Extent >
constexpr bool ranges:: enable_view < std :: span < T, Extent >> = true ;
(начиная с C++20)

Эта специализация ranges::enable_view позволяет span удовлетворять требованиям view .

Руководства по выводу

Примечания

Специализации std::span уже являются тривиально копируемыми типами во всех существующих реализациях, даже до формального требования, введенного в C++23.

Макрос тестирования функций Значение Стандарт Функция
__cpp_lib_span 202002L (C++20) std::span
202311L (C++26) std::span::at
__cpp_lib_span_initializer_list 202311L (C++26) Конструирование std::span из std::initializer_list

Пример

В примере используется std::span для реализации некоторых алгоритмов над непрерывными диапазонами.

#include <algorithm>
#include <cstddef>
#include <iostream>
#include <span>
template<class T, std::size_t N>
[[nodiscard]]
constexpr auto slide(std::спан<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>
constexpr bool starts_with(std::span<T, N> data, std::спан<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>
constexpr bool ends_with(std::спан<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>
constexpr bool contains(std::спан<T, N> span, std::span<T, M> sub)
{
    return std::ranges::search(span, sub).begin() != span.end();
}
void println(const auto& seq)
{
    for (const auto& elem : seq)
        std::cout << elem << ' ';
    std::cout << '\n';
}
int main()
{
    constexpr int a[]{0, 1, 2, 3, 4, 5, 6, 7, 8};
    constexpr int b[]{8, 7, 6};
    constexpr static std::size_t width{6};
    for (std::size_t offset{}; ; ++offset)
        if (auto s = slide(std::span{a}, offset, width); !s.empty())
            println(s);
        else
            break;
    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::спан{a}, std::span{a + 6, 3})
        && !ends_with(std::span{a}, std::span{a + 6, 2})
        && contains(std::спан{a}, std::span{a + 1, 4})
        && !contains(std::span{a, 8}, std::span{a, 9})
    );
}

Вывод:

0 1 2 3 4 5
1 2 3 4 5 6
2 3 4 5 6 7
3 4 5 6 7 8

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 3203 C++20 было неясно, когда указатели, итераторы и
ссылки на элементы span инвалидируются
прояснено
LWG 3903 C++20 объявление деструктора span было избыточным удалено объявление
P2325R3 C++20 span с ненулевой статической протяжённостью не являлся view любой span является view

Смотрите также

(C++23)
многомерное невладеющее представление массива
(шаблон класса)
объединяет пару итератор-страж в view
(шаблон класса)
ссылается на временный массив, созданный при списковой инициализации
(шаблон класса)
представление строки только для чтения
(шаблон класса)