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 - определяет способ преобразования многомерного индекса в базовый 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

Члены-данные

Объект члена Определение
acc_ (private) Обработчик типа accessor_type
(объект члена-только для демонстрации*)
map_ (private) Таблицу соответствия типа mapping_type
(объект члена-только для демонстрации*)
ptr_ (private) Базовое обращение к данным типа data_handle_type
(объект члена-только для демонстрации*)

Члены-функции

(конструктор)
создаёт mdspan
(публичная функция-член)
operator=
присваивает mdspan
(публичная функция-член)
Доступ к элементам
operator[]
обращается к элементу по указанному многомерному индексу
(публичная функция-член)
Наблюдатели
size
возвращает размер пространства многомерного индекса
(публичная функция-член)
empty
проверяет, равен ли размер пространства индексов нулю
(публичная функция-член)
stride
получает шаг вдоль указанного измерения
(публичная функция-член)
extents
получает объект extents
(публичная функция-член)
data_handle
получает указатель на базовую 1D последовательность
(публичная функция-член)
mapping
получает объект отображения
(публичная функция-член)
accessor
получает объект политики доступа
(публичная функция-член)
is_unique
определяет, является ли отображение mdspan уникальным (каждая комбинация индексов отображается на другой базовый элемент)
(публичная функция-член)
is_exhaustive
определяет, является ли отображение mdspan исчерпывающим (каждый базовый элемент может быть получен с помощью некоторой комбинации индексов)
(публичная функция-член)
is_strided
определяет, является ли отображение mdspan с шагом (в каждом измерении увеличение индекса пропускает то же количество базовых элементов каждый раз)
(публичная функция-член)
is_always_unique
[статический]
определяет, всегда ли отображение layout mdspan уникальным
(публичная статическая функция-член)
is_always_exhaustive
[статический]
определяет, всегда ли отображение layout mdspan исчерпывающим
(публичная статическая функция-член)
is_always_strided
[статический]
определяет, всегда ли отображение layout mdspan с шагом
(публичная статическая функция-член)

Функции вне класса

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

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

extents
(C++23)
описание многомерного пространства индексов некоторого ранга
(шаблон класса)
dextents
(C++23)
удобный псевдоним-шаблон для полностью динамического std::extents
(псевдоним-шаблон)
layout_right
(C++23)
политика отображения расположения многомерного массива по строкам; крайний правый размер имеет шаг 1
(класс)
layout_left
(C++23)
политика отображения расположения многомерного массива по столбцам; крайний левый размер имеет шаг 1
(класс)
layout_stride
(C++23)
политика отображения расположения с пользовательскими шагами
(класс)
default_accessor
(C++23)
тип для индексированного доступа к элементам mdspan
(шаблон класса)
Вспомогательные функции для подмножеств
full_extentfull_extent_t
(C++26)
метка спецификатора среза, описывающая весь диапазон индексов в указанном размере
(метка)
strided_slice
(C++26)
спецификатор среза, представляющий набор регулярно расположенных индексов, как указано смещением, размером и шагом
(шаблон класса)
submdspan_mapping_result
(C++26)
тип возвращаемого значения перегрузок submdspan_mapping
(шаблон класса)

Руководства по выводу

Примечания

Тест на наличие функции макрос Значение Std Функция
__cpp_lib_mdspan 202207L (C++23) std::mdspan
__cpp_lib_submdspan 202306L (C++26) std::submdspan

Пример

Можно предварительно просмотреть на 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/w/cpp/container/mdspan

Spec-Zone.ru

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