std:: mdspan
|
定義ヘッダー
<mdspan>
|
||
|
template
<
class
T,
|
(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 | - | 多次元インデックスを基盤となる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
のランクを返す
(公開静的メンバ関数) |
|
[static]
|
mdspan
の動的ランクを返す
(公開静的メンバ関数) |
|
[static]
|
指定されたランクインデックスにおける
mdspan
の静的エクステントサイズを返す
(公開静的メンバ関数) |
指定されたランクインデックスにおける
mdspan
のエクステントを返す
(公開メンバ関数) |
|
|
多次元インデックス空間のサイズを返す
(公開メンバ関数) |
|
|
インデックス空間のサイズがゼロかどうかをチェックする
(公開メンバ関数) |
|
|
指定された次元に沿ったストライドを取得する
(公開メンバ関数) |
|
|
エクステントオブジェクトを取得する
(公開メンバ関数) |
|
|
基盤となる1次元シーケンスへのポインタを取得する
(公開メンバ関数) |
|
|
マッピングオブジェクトを取得する
(公開メンバ関数) |
|
|
アクセサポリシーオブジェクトを取得する
(公開メンバ関数) |
|
|
このmdspanのマッピングが一意かどうかを判定する(すべてのインデックスの組み合わせが異なる基盤要素にマップされる)
(公開メンバ関数) |
|
|
このmdspanのマッピングが網羅的かどうかを判定する(すべての基盤要素が何らかのインデックスの組み合わせでアクセス可能)
(公開メンバ関数) |
|
|
このmdspanのマッピングがストライドされているかどうかを判定する(各次元で、インデックスをインクリメントするたびに同じ数の基盤要素をスキップする)
(公開メンバ関数) |
|
|
[static]
|
このmdspanのレイアウトマッピングが常に一意かどうかを判定する
(公開静的メンバ関数) |
|
[static]
|
このmdspanのレイアウトマッピングが常に網羅的かどうかを判定する
(公開静的メンバ関数) |
|
[static]
|
このmdspanのレイアウトマッピングが常にストライドされているかどうかを判定する
(公開静的メンバ関数) |
非メンバー関数
|
(C++23)
|
mdspan用の
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
サブビュー |
|
|
(C++26)
|
既存の
mdspan
のサブセットのビューを返す
(関数テンプレート) |
|
(C++26)
|
既存のextentsとスライス指定子から新しいextentsを作成する
(関数テンプレート) |
ヘルパー型とテンプレート
|
(C++23)
|
多次元インデックス空間の記述子
(クラステンプレート) |
|
(C++23)
(C++26)
|
すべて動的な
std::extents
の便利なエイリアステンプレート
(エイリアステンプレート) |
|
(C++23)
|
mdspan
の要素へのインデックス付きアクセスのための型
(クラステンプレート) |
|
(C++26)
|
mdspan
の要素へのアライメントされたアクセスのための型
(クラステンプレート) |
レイアウトマッピングポリシー |
|
|
(C++23)
|
列優先多次元配列レイアウトマッピングポリシー;左端のエクステントがストライド
1
を持つ
(クラス) |
|
(C++23)
|
行優先多次元配列レイアウトマッピングポリシー;右端のエクステントがストライド
1
を持つ
(クラス) |
|
(C++23)
|
ユーザー定義ストライドを持つレイアウトマッピングポリシー
(クラス) |
|
(C++26)
|
左端のエクステント以上のパディングストライドを持つ列優先レイアウトマッピングポリシー
(クラステンプレート) |
|
(C++26)
|
右端のエクステント以上のパディングストライドを持つ行優先レイアウトマッピングポリシー
(クラステンプレート) |
サブビューヘルパー |
|
|
(C++26)
|
指定されたエクステント内の全インデックス範囲を記述するスライス指定子タグ
(タグ) |
|
(C++26)
|
オフセット、エクステント、ストライドで示される規則的に間隔を置いたインデックスの集合を表すスライス指定子
(クラステンプレート) |
|
(C++26)
|
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)
|
連続したオブジェクトシーケンスに対する非所有ビュー
(クラステンプレート) |
|
数値配列、配列マスクおよび配列スライス
(クラステンプレート) |