Пространства имён
Варианты
Действия

#MAGICTITLESTRING#

Материал из cppreference.com
< cpp‎ | container
 
 
 
 
Определено в заголовочном файле <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 определяет, как преобразовать многомерный индекс в базовый 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 функция-элемент) [править]
определяет, всегда ли отображение макета этого mdspan уникально
(public static функция-элемент) [править]
определяет, всегда ли сопоставление макета этого mdspan является исчерп��вающим
(public static функция-элемент) [править]
определяет, всегда ли выполняется сопоставление макета этого mdspan
(public static функция-элемент) [править]

[править] Функции, не являющиеся элементами

специализация алгоритма std::swap для mdspan
(шаблон функции) [править]

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

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