Namespaces
Variants

std:: mdspan

From cppreference.net
Определено в заголовочном файле <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 и удовлетворяет:

Специализация 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
(публичная статическая функция-член)
возвращает динамический ранг mdspan
(публичная статическая функция-член)
возвращает статический размер экстента mdspan по заданному индексу ранга
(публичная статическая функция-член)
возвращает экстент mdspan по заданному индексу ранга
(публичная функция-член)
возвращает размер многомерного индексного пространства
(публичная функция-член)
проверяет, равен ли размер индексного пространства нулю
(публичная функция-член)
получает шаг вдоль указанного измерения
(публичная функция-член)
получает объект экстентов
(публичная функция-член)
получает указатель на базовую одномерную последовательность
(публичная функция-член)
получает объект отображения
(публичная функция-член)
получает объект политики доступа
(публичная функция-член)
определяет, является ли отображение этого mdspan уникальным (каждая комбинация индексов отображается на уникальный базовый элемент)
(публичная функция-член)
определяет, является ли отображение этого mdspan исчерпывающим (каждый базовый элемент может быть доступен с некоторой комбинацией индексов)
(публичная функция-член)
определяет, является ли отображение этого mdspan страйдовым (в каждом измерении инкремент индекса пропускает одинаковое количество базовых элементов каждый раз)
(публичная функция-член)
определяет, является ли отображение макета этого mdspan всегда уникальным
(публичная статическая функция-член)
определяет, является ли отображение макета этого mdspan всегда исчерпывающим
(публичная статическая функция-член)
определяет, является ли отображение макета этого mdspan всегда страйдовым
(публичная статическая функция-член)

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

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

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

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