std:: mdspan
|
Определено в заголовочном файле
<mdspan>
|
||
|
template
<
class
T,
|
(начиная с C++23) | |
std::mdspan
является многомерным представлением массива, которое отображает многомерный индекс в элемент массива. Политики отображения и доступа к элементам настраиваются, а базовый массив не обязательно должен быть непрерывным или даже вообще существовать в памяти.
Каждая специализация
MDS
для
mdspan
моделирует
copyable
и удовлетворяет:
-
- std:: is_nothrow_move_constructible_v < MDS > равно true ,
- std:: is_nothrow_move_assignable_v < MDS > равно true , и
- std:: is_nothrow_swappable_v < MDS > равно true .
Специализация
mdspan
является
TriviallyCopyable
типом, если её
accessor_type
,
mapping_type
и
data_handle_type
являются
TriviallyCopyable
типами.
Содержание |
Параметры шаблона
| T | - | тип элемента; полный объектный тип, который не является ни абстрактным классом, ни массивом. |
| Extents | - | определяет количество измерений, их размеры и какие из них известны на этапе компиляции. Должен быть специализацией std::extents . |
| LayoutPolicy | - | определяет, как преобразовать многомерный индекс в одномерный (столбцовый 3D массив, симметричная треугольная 2D матрица и т.д.). Должен удовлетворять требованиям LayoutMappingPolicy . |
| AccessorPolicy | - | определяет, как преобразовать одномерный индекс в ссылку на T. Должен удовлетворять ограничению, что std:: is_same_v < T, typename AccessorPolicy :: element_type > равно true . Должен удовлетворять требованиям AccessorPolicy . |
Типы членов
| Член | Определение |
extents_type
|
Extents
|
layout_type
|
LayoutPolicy
|
accessor_type
|
AccessorPolicy
|
mapping_type
|
LayoutPolicy :: mapping < Extents > |
element_type
|
T
|
value_type
|
std:: remove_cv_t < T > |
index_type
|
Extents :: index_type |
size_type
|
Extents :: size_type |
rank_type
|
Extents :: rank_type |
data_handle_type
|
AccessorPolicy :: data_handle_type |
reference
|
AccessorPolicy :: reference |
Члены данных
| Участник | Описание |
accessor_type
acc_
(приватный)
|
аксессор
( объект-участник только для демонстрации* ) |
mapping_type
map_
(приватный)
|
маппинг расположения
( объект-участник только для демонстрации* ) |
data_handle_type
ptr_
(приватный)
|
базовый обработчик данных
( объект-участник только для демонстрации* ) |
Функции-члены
создает
mdspan
(публичная функция-член) |
|
присваивает
mdspan
(публичная функция-член) |
|
Доступ к элементам |
|
|
обращается к элементу по указанному многомерному индексу
(публичная функция-член) |
|
Наблюдатели |
|
|
[static]
|
возвращает ранг
mdspan
(публичная статическая функция-член) |
|
[static]
|
возвращает динамический ранг
mdspan
(публичная статическая функция-член) |
|
[static]
|
возвращает статический размер экстента
mdspan
по заданному индексу ранга
(публичная статическая функция-член) |
возвращает экстент
mdspan
по заданному индексу ранга
(публичная функция-член) |
|
|
возвращает размер многомерного индексного пространства
(публичная функция-член) |
|
|
проверяет, равен ли размер индексного пространства нулю
(публичная функция-член) |
|
|
получает шаг вдоль указанного измерения
(публичная функция-член) |
|
|
получает объект экстентов
(публичная функция-член) |
|
|
получает указатель на базовую одномерную последовательность
(публичная функция-член) |
|
|
получает объект отображения
(публичная функция-член) |
|
|
получает объект политики доступа
(публичная функция-член) |
|
|
определяет, является ли отображение этого mdspan уникальным (каждая комбинация индексов отображается на уникальный базовый элемент)
(публичная функция-член) |
|
|
определяет, является ли отображение этого mdspan исчерпывающим (каждый базовый элемент может быть доступен с некоторой комбинацией индексов)
(публичная функция-член) |
|
|
определяет, является ли отображение этого mdspan страйдовым (в каждом измерении инкремент индекса пропускает одинаковое количество базовых элементов каждый раз)
(публичная функция-член) |
|
|
[static]
|
определяет, является ли отображение макета этого mdspan всегда уникальным
(публичная статическая функция-член) |
|
[static]
|
определяет, является ли отображение макета этого mdspan всегда исчерпывающим
(публичная статическая функция-член) |
|
[static]
|
определяет, является ли отображение макета этого mdspan всегда страйдовым
(публичная статическая функция-член) |
Функции, не являющиеся членами класса
|
(C++23)
|
специализирует алгоритм
std::swap
для mdspan
(шаблон функции) |
Подпредставления |
|
|
(C++26)
|
возвращает представление подмножества существующего
mdspan
(шаблон функции) |
|
(C++26)
|
создаёт новые размерности из существующих размерностей и спецификаторов срезов
(шаблон функции) |
Вспомогательные типы и шаблоны
|
(C++23)
|
дескриптор многомерного индексного пространства некоторого ранга
(шаблон класса) |
|
(C++23)
(C++26)
|
удобный псевдоним шаблона для полностью динамического
std::extents
(псевдоним шаблона) |
|
(C++23)
|
тип для индексированного доступа к элементам
mdspan
(шаблон класса) |
|
(C++26)
|
тип для выровненного доступа к элементам
mdspan
(шаблон класса) |
Политики отображения размещения |
|
|
(C++23)
|
политика отображения размещения многомерного массива по столбцам; крайнее левое измерение имеет шаг
1
(класс) |
|
(C++23)
|
политика отображения размещения многомерного массива по строкам; крайнее правое измерение имеет шаг
1
(класс) |
|
(C++23)
|
политика отображения размещения с пользовательскими шагами
(класс) |
|
(C++26)
|
политика отображения размещения по столбцам с шагом заполнения, который может быть больше или равен крайнему левому измерению
(шаблон класса) |
|
(C++26)
|
политика отображения размещения по строкам с шагом заполнения, который может быть больше или равен крайнему правому измерению
(шаблон класса) |
Вспомогательные средства для подпредставлений |
|
|
(C++26)
|
тег-спецификатор среза, описывающий полный диапазон индексов в указанном измерении.
(тег) |
|
(C++26)
|
спецификатор среза, представляющий набор регулярно расположенных индексов, задаваемых смещением, размером и шагом
(шаблон класса) |
|
(C++26)
|
тип возвращаемого значения перегрузок
submdspan_mapping
(шаблон класса) |
Руководства по выводу
Примечания
| Макрос тестирования возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_mdspan
|
202207L
|
(C++23) |
std::mdspan
|
__cpp_lib_submdspan
|
202306L
|
(C++26) | std::submdspan |
202403L
|
(C++26) |
std::mdspan
выровненные макеты
|
|
__cpp_lib_aligned_accessor
|
202411L
|
(C++26) | std::aligned_accessor |
Пример
Можно посмотреть на Compiler Explorer .
#include <cstddef> #include <mdspan> #include <print> #include <vector> int main() { std::vector v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; // View data as contiguous memory representing 2 rows of 6 ints each auto ms2 = std::mdspan(v.data(), 2, 6); // View the same data as a 3D array 2 x 3 x 2 auto ms3 = std::mdspan(v.data(), 2, 3, 2); // Write data using 2D view for (std::size_t i = 0; i != ms2.extent(0); i++) for (std::size_t j = 0; j != ms2.extent(1); j++) ms2[i, j] = i * 1000 + j; // Read back using 3D view for (std::size_t i = 0; i != ms3.extent(0); i++) { std::println("slice @ i = {}", i); for (std::size_t j = 0; j != ms3.extent(1); j++) { for (std::size_t k = 0; k != ms3.extent(2); k++) std::print("{} ", ms3[i, j, k]); std::println(""); } } }
Вывод:
slice @ i = 0 0 1 2 3 4 5 slice @ i = 1 1000 1001 1002 1003 1004 1005
Смотрите также
|
(C++20)
|
невладеющее представление непрерывной последовательности объектов
(шаблон класса) |
|
числовые массивы, маски массивов и срезы массивов
(шаблон класса) |