Spec-Zone.ru › C++

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
(открытая функция-член)
operator=
присваивает mdspan
(открытая функция-член)
Доступ к элементам
operator[]
осуществляет доступ к элементу по указанному многомерному индексу
(открытая функция-член)
Наблюдатели
rank
[статический]
возвращает ранг mdspan
(открытая статическая функция-член)
rank_dynamic
[статический]
возвращает динамический ранг mdspan
(открытая статическая функция-член)
static_extent
[статический]
возвращает размер статического диапазона mdspan с заданным индексом ранга
(открытая статическая функция-член)
extent
возвращает диапазон mdspan с заданным индексом ранга
(открытая функция-член)
size
возвращает размер многомерного индексного пространства
(открытая функция-член)
empty
проверяет, равен ли нулю размер индексного пространства
(открытая функция-член)
stride
получает шаг вдоль указанного измерения
(открытая функция-член)
extents
получает объект extents
(открытая функция-член)
data_handle
получает указатель на базовую одномерную последовательность
(открытая функция-член)
mapping
получает объект отображения
(открытая функция-член)
accessor
получает объект политики доступа
(открытая функция-член)
is_unique
определяет, является ли отображение этого mdspan уникальным (каждая комбинация индексов отображается на отдельный базовый элемент)
(открытая функция-член)
is_exhaustive
определяет, является ли отображение этого mdspan исчерпывающим (к каждому базовому элементу можно обратиться с помощью некоторой комбинации индексов)
(открытая функция-член)
is_strided
определяет, является ли отображение этого mdspan страйдовым (в каждом измерении приращение индекса каждый раз пропускает одинаковое количество базовых элементов)
(открытая функция-член)
is_always_unique
[статический]
определяет, всегда ли отображение размещения этого mdspan уникально
(открытая статическая функция-член)
is_always_exhaustive
[статический]
определяет, всегда ли отображение размещения этого mdspan является исчерпывающим
(открытая статическая функция-член)
is_always_strided
[статический]
определяет, всегда ли отображение размещения этого mdspan является страйдовым
(открытая статическая функция-член)

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

std::swap(std::mdspan)
(C++23)
специализирует алгоритм std::swap для mdspan
(шаблон функции)
Подпредставления
submdspan
(C++26)
возвращает представление подмножества существующего mdspan
(шаблон функции)
submdspan_extents
(C++26)
создаёт новые диапазоны на основе существующих диапазонов и спецификаторов среза
(шаблон функции)

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

extents
(C++23)
дескриптор многомерного индексного пространства заданного ранга
(шаблон класса)
dextentsdims
(C++23)(C++26)
вспомогательный шаблон псевдонима для std::extents со всеми динамическими размерами
(шаблон псевдонима)
default_accessor
(C++23)
тип для индексированного доступа к элементам mdspan
(шаблон класса)
aligned_accessor
(C++26)
тип для выровненного доступа к элементам mdspan
(шаблон класса)
Политики отображения размещения
layout_left
(C++23)
политика отображения размещения многомерного массива с порядком хранения по столбцам; шаг крайнего левого диапазона равен 1
(класс)
layout_right
(C++23)
политика отображения размещения многомерного массива с порядком хранения по строкам; шаг крайнего правого диапазона равен 1
(класс)
layout_stride
(C++23)
политика отображения размещения с задаваемыми пользователем шагами
(класс)
layout_left_padded
(C++26)
политика размещения по столбцам с шагом дополнения, который может быть больше или равен крайнему левому диапазону
(шаблон класса)
layout_right_padded
(C++26)
политика размещения по строкам с шагом дополнения, который может быть больше или равен крайнему правому диапазону
(шаблон класса)
Вспомогательные средства для подпредставлений
full_extentfull_extent_t
(C++26)
тег спецификатора среза, обозначающий полный диапазон индексов в указанном измерении.
(тег)
strided_slice
(C++26)
спецификатор среза, представляющий набор равномерно распределённых индексов, заданный смещением, диапазоном и шагом
(шаблон класса)
submdspan_mapping_result
(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

См. также

span
(C++20)
невладеющее представление непрерывной последовательности объектов
(шаблон класса)
valarray
числовые массивы, маски массивов и срезы массивов
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/mdspan

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API