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 - 多次元インデックスを基盤となる1次元インデックスに変換する方法を指定する(列優先3次元配列、対称三角2次元行列など)。 LayoutMappingPolicy の要件を満たさなければならない。
AccessorPolicy - 基盤となる1次元インデックスを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_ (private) アクセサ
( 説明専用メンバーオブジェクト* )
mapping_type map_ (private) レイアウトマッピング
( 説明専用メンバーオブジェクト* )
data_handle_type ptr_ (private) 基盤となるデータハンドル
( 説明専用メンバーオブジェクト* )

メンバー関数

mdspan を構築する
(公開メンバ関数)
mdspan を代入する
(公開メンバ関数)
要素アクセス
指定された多次元インデックスの要素にアクセスする
(公開メンバ関数)
オブザーバ
[static]
mdspan のランクを返す
(公開静的メンバ関数)
mdspan の動的ランクを返す
(公開静的メンバ関数)
指定されたランクインデックスにおける mdspan の静的エクステントサイズを返す
(公開静的メンバ関数)
指定されたランクインデックスにおける mdspan のエクステントを返す
(公開メンバ関数)
多次元インデックス空間のサイズを返す
(公開メンバ関数)
インデックス空間のサイズがゼロかどうかをチェックする
(公開メンバ関数)
指定された次元に沿ったストライドを取得する
(公開メンバ関数)
エクステントオブジェクトを取得する
(公開メンバ関数)
基盤となる1次元シーケンスへのポインタを取得する
(公開メンバ関数)
マッピングオブジェクトを取得する
(公開メンバ関数)
アクセサポリシーオブジェクトを取得する
(公開メンバ関数)
このmdspanのマッピングが一意かどうかを判定する(すべてのインデックスの組み合わせが異なる基盤要素にマップされる)
(公開メンバ関数)
このmdspanのマッピングが網羅的かどうかを判定する(すべての基盤要素が何らかのインデックスの組み合わせでアクセス可能)
(公開メンバ関数)
このmdspanのマッピングがストライドされているかどうかを判定する(各次元で、インデックスをインクリメントするたびに同じ数の基盤要素をスキップする)
(公開メンバ関数)
このmdspanのレイアウトマッピングが常に一意かどうかを判定する
(公開静的メンバ関数)
このmdspanのレイアウトマッピングが常に網羅的かどうかを判定する
(公開静的メンバ関数)
このmdspanのレイアウトマッピングが常にストライドされているかどうかを判定する
(公開静的メンバ関数)

非メンバー関数

mdspan用の std::swap アルゴリズムを特殊化する
(関数テンプレート)
サブビュー
(C++26)
既存の mdspan のサブセットのビューを返す
(関数テンプレート)
既存のextentsとスライス指定子から新しいextentsを作成する
(関数テンプレート)

ヘルパー型とテンプレート

(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};
    // データを6つのintからなる2行として連続メモリで表示
    auto ms2 = std::mdspan(v.data(), 2, 6);
    // 同じデータを3次元配列 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("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)
連続したオブジェクトシーケンスに対する非所有ビュー
(クラステンプレート)
数値配列、配列マスクおよび配列スライス
(クラステンプレート)