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 (публичная функция-член) |
|
присваивает mdspan (публичная функция-член) |
|
Доступ к элементам |
|
| обращается к элементу по указанному многомерному индексу (публичная функция-член) |
|
Наблюдатели |
|
| возвращает размер пространства многомерного индекса (публичная функция-член) |
|
| проверяет, равен ли размер пространства индексов нулю (публичная функция-член) |
|
| получает шаг вдоль указанного измерения (публичная функция-член) |
|
| получает объект extents (публичная функция-член) |
|
| получает указатель на базовую 1D последовательность (публичная функция-член) |
|
| получает объект отображения (публичная функция-член) |
|
| получает объект политики доступа (публичная функция-член) |
|
| определяет, является ли отображение mdspan уникальным (каждая комбинация индексов отображается на другой базовый элемент) (публичная функция-член) |
|
| определяет, является ли отображение mdspan исчерпывающим (каждый базовый элемент может быть получен с помощью некоторой комбинации индексов) (публичная функция-член) |
|
| определяет, является ли отображение mdspan с шагом (в каждом измерении увеличение индекса пропускает то же количество базовых элементов каждый раз) (публичная функция-член) |
|
|
[статический] | определяет, всегда ли отображение layout mdspan уникальным (публичная статическая функция-член) |
|
[статический] | определяет, всегда ли отображение layout mdspan исчерпывающим (публичная статическая функция-член) |
|
[статический] | определяет, всегда ли отображение layout mdspan с шагом (публичная статическая функция-член) |
Функции вне класса
|
(C++23) | специализирует алгоритм std::swap для mdspan (шаблон функции) |
Подмножества |
|
|
(C++26) | создаёт новые размеры из существующих размеров и спецификаторов срезов (шаблон функции) |
|
(C++26) | возвращает представление подмножества существующего mdspan (шаблон функции) |
Вспомогательные типы и шаблоны
|
(C++23) | описание многомерного пространства индексов некоторого ранга (шаблон класса) |
|
(C++23) | удобный псевдоним-шаблон для полностью динамического std::extents(псевдоним-шаблон) |
|
(C++23) | политика отображения расположения многомерного массива по строкам; крайний правый размер имеет шаг 1 (класс) |
|
(C++23) | политика отображения расположения многомерного массива по столбцам; крайний левый размер имеет шаг 1 (класс) |
|
(C++23) | политика отображения расположения с пользовательскими шагами (класс) |
|
(C++23) | тип для индексированного доступа к элементам mdspan (шаблон класса) |
Вспомогательные функции для подмножеств |
|
|
(C++26) | метка спецификатора среза, описывающая весь диапазон индексов в указанном размере (метка) |
|
(C++26) | спецификатор среза, представляющий набор регулярно расположенных индексов, как указано смещением, размером и шагом (шаблон класса) |
|
(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
См. также
|
(C++20) | невладеющее представление непрерывной последовательности объектов (шаблон класса) |
| числовые массивы, маски массивов и срезы массивов (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/mdspan