std::mdspan
Определён в заголовке <mdspan> | ||
|---|---|---|
template<
class T,
class Extents,
class LayoutPolicy = std::layout_right,
class AccessorPolicy = std::default_accessor<T>
> class mdspan;
| (начиная с 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 | - | задаёт преобразование многомерного индекса в базовый одномерный индекс (например, для трёхмерного массива с порядком хранения по столбцам или симметричной треугольной двумерной матрицы). Должен удовлетворять требованиям 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 (открытая функция-член) |
|
Доступ к элементам |
|
| осуществляет доступ к элементу по указанному многомерному индексу (открытая функция-член) |
|
Наблюдатели |
|
|
[статический] | возвращает ранг mdspan (открытая статическая функция-член) |
|
[статический] | возвращает динамический ранг mdspan (открытая статическая функция-член) |
|
[статический] | возвращает размер статического диапазона mdspan с заданным индексом ранга (открытая статическая функция-член) |
возвращает диапазон mdspan с заданным индексом ранга (открытая функция-член) |
|
| возвращает размер многомерного индексного пространства (открытая функция-член) |
|
| проверяет, равен ли нулю размер индексного пространства (открытая функция-член) |
|
| получает шаг вдоль указанного измерения (открытая функция-член) |
|
| получает объект extents (открытая функция-член) |
|
| получает указатель на базовую одномерную последовательность (открытая функция-член) |
|
| получает объект отображения (открытая функция-член) |
|
| получает объект политики доступа (открытая функция-член) |
|
| определяет, является ли отображение этого mdspan уникальным (каждая комбинация индексов отображается на отдельный базовый элемент) (открытая функция-член) |
|
| определяет, является ли отображение этого mdspan исчерпывающим (к каждому базовому элементу можно обратиться с помощью некоторой комбинации индексов) (открытая функция-член) |
|
| определяет, является ли отображение этого mdspan страйдовым (в каждом измерении приращение индекса каждый раз пропускает одинаковое количество базовых элементов) (открытая функция-член) |
|
|
[статический] | определяет, всегда ли отображение размещения этого mdspan уникально (открытая статическая функция-член) |
|
[статический] | определяет, всегда ли отображение размещения этого mdspan является исчерпывающим (открытая статическая функция-член) |
|
[статический] | определяет, всегда ли отображение размещения этого 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) | невладеющее представление непрерывной последовательности объектов (шаблон класса) |
| числовые массивы, маски массивов и срезы массивов (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/mdspan