std:: span
|
Определено в заголовочном файле
<span>
|
||
|
template
<
class
T,
|
(начиная с C++20) | |
Класс-шаблон
span
описывает объект, который может ссылаться на непрерывную последовательность объектов с первым элементом последовательности в позиции ноль.
span
может иметь либо
статический
размер, в этом случае количество элементов в последовательности известно во время компиляции и закодировано в типе, либо
динамический
размер.
Для
span
s
указатели, итераторы и ссылки на элементы
s
становятся недействительными, когда операция инвалидирует указатель в диапазоне
[
s.
data
(
)
,
s.
data
(
)
+
s.
size
(
)
)
.
|
Каждая специализация
|
(начиная с 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 > |
-
↑
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) |
Итераторы |
|
|
(C++23)
|
возвращает итератор на начало
(public member function) |
|
(C++23)
|
возвращает итератор на конец
(public member function) |
|
(C++23)
|
возвращает обратный итератор на начало
(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) |
|
Функции, не являющиеся членами класса
|
(C++20)
|
преобразует
span
в представление его базовых байтов
(шаблон функции) |
Вспомогательная константа
|
(C++20)
|
константа типа
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)
|
многомерное невладеющее представление массива
(шаблон класса) |
|
(C++20)
|
объединяет пару итератор-страж в
view
(шаблон класса) |
|
(C++11)
|
ссылается на временный массив, созданный при
списковой инициализации
(шаблон класса) |
|
(C++17)
|
представление строки только для чтения
(шаблон класса) |