#MAGICTITLESTRING#
Материал из cppreference.com
Определено в заголовочном файле <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 | — | определяет, как преобразовать многомерный индекс в базовый 1D-индекс (3D-массив с основными столбцами, симметричная треугольная 2D-матрица и т.д.) |
AccessorPolicy | — | указывает, как преобразовать базовый 1D-индекс в ссылку на T. Должен соответствовать ограничению, чтобы std::is_same_v<T, typename AccessorPolicy::element_type> было равно true. |
Этот раздел не завершён Причина: добавить требование политики компоновки и политики доступа. |
[править] Типы элементы
Тип элемент | Определение |
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 (только для пояснения объект элемент*) | |
Сопоставление компоновки типа mapping_type (только для пояснения объект элемент*) | |
Базовый дескриптор данных типа data_handle_type (только для пояснения объект элемент*) |
[править] Функции-элементы
создаёт mdspan (public функция-элемент) | |
присваивает mdspan (public функция-элемент) | |
Доступ к элементам | |
обращается к элементу по указанному многомерному индексу (public функция-элемент) | |
Наблюдатели | |
возвращает размер многомерного индексного пространства (public функция-элемент) | |
проверяет, равен ли размер индексного пространства нулю (public функция-элемент) | |
получает шаг по указанному измерению (public функция-элемент) | |
получает объект extents (public функция-элемент) | |
получает указатель на базовую одномерную последовательность (public функция-элемент) | |
получает объект сопоставления (public функция-элемент) | |
получает объект политики доступа (public функция-элемент) | |
определяет, является ли сопоставление этого mdspan уникальным (каждая комбинация индексов сопоставляется с другим базовым элементом) (public функция-элемент) | |
определяет, является ли отображение этого mdspan исчерпывающим (каждый базовый элемент может быть доступен с некоторой комбинацией индексов) (public функция-элемент) | |
определяет, является ли сопоставление этого mdspan пошаговым (в каждом измерении приращение индекса каждый раз перескакивает через одно и то же количество базовых элементов) (public функция-элемент) | |
[static] |
определяет, всегда ли отображение макета этого mdspan уникально (public static функция-элемент) |
[static] |
определяет, всегда ли сопоставление макета этого mdspan является исчерп��вающим (public static функция-элемент) |
[static] |
определяет, всегда ли выполняется сопоставление макета этого mdspan (public static функция-элемент) |
[править] Функции, не являющиеся элементами
(C++23) |
специализация алгоритма std::swap для mdspan (шаблон функции) |
[править] Вспомогательные типы и шаблоны
(C++23) |
дескриптор многомерного индексного пространства некоторого ранга (шаблон класса) |
(C++23) |
удобный псевдоним для полностью динамического std::extents (шаблон класса) |
(C++23) |
отображение компоновки многомерного массива по строкам; крайний правый размер имеет шаг 1 (класс) |
(C++23) |
отображение макета многомерного массива по столбцам; крайний левый размер имеет шаг 1 (класс) |
(C++23) |
отображение макета с заданными пользователем шагами (класс) |
(C++23) |
тип для индексированного доступа к элементам mdspan (шаблон класса) |
[править] Правила вывода(c++23)
[править] Примечание
Макрос Тестирования функциональности | Значение | Стандарт | Функциональность |
---|---|---|---|
__cpp_lib_mdspan |
202207L | (C++23) | std::mdspan
|
[править] Пример
можно просмотреть на https://godbolt.org/z/PK7bccGr3
Запустить этот код
#include <vector> #include <mdspan> #include <print> int main() { std::vector v = {1,2,3,4,5,6,7,8,9,10,11,12}; // Просматривает данные как непрерывную память, представляющую 2 строки // по 6 целых чисел в каждой. auto ms2 = std::mdspan(v.data(), 2, 6); // Просматривает тех же данные в виде трёхмерного массива 2 x 3 x 2 auto ms3 = std::mdspan(v.data(), 2, 3, 2); // запись данных с использованием 2D-вида 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; // прочитать обратно, используя 3D-вид for(std::size_t i=0; i != ms3.extent(0); i++) { std::println("срез @ 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(""); } } }
Вывод:
срез @ i = 0 0 1 2 3 4 5 срез @ i = 1 1000 1001 1002 1003 1004 1005
[править] Смотрите также
(C++20) |
не владеющее представление непрерывной последовательности объектов (шаблон класса) |
числовые массивы, маски массивов и срезы массивов (шаблон класса) |