std::mdspan
From cppreference.com
| ヘッダー <mdspan> で定義 |
||
| template< class T, |
(C++23から) | |
std::mdspan は、多次元インデックスを配列の要素にマッピングする多次元配列ビューです。マッピングと要素アクセスのポリシーは設定可能であり、基になる配列は連続している必要も、メモリ上に存在する(訳注:物理的にメモリに配置されている)必要さえもありません。
mdspan の各特殊化 MDS は 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 の特殊化は、その accessor_type, mapping_type, data_handle_type が TriviallyCopyable な型である場合、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 を構築する(public member function) | |
mdspan を代入する(public member function) | |
要素アクセス | |
| 指定された多次元インデックスの要素にアクセスする (public member function) | |
監視 | |
| [static] |
mdspan のランクを返す(public static member function) |
| [static] |
mdspan の動的なランクを返す(public static member function) |
| [static] |
指定されたランクインデックスにおける mdspan の静的なエクステントサイズを返す(public static member function) |
指定されたランクインデックスにおける mdspan のエクステントを返す(public member function) | |
| 多次元インデックス空間のサイズを返す (public member function) | |
| インデックス空間のサイズがゼロかどうかをチェックする (public member function) | |
| 指定された次元に沿ったストライドを取得する (public member function) | |
| extents オブジェクトを取得する (public member function) | |
| 基になる1次元シーケンスへのポインタを取得する (public member function) | |
| マッピングオブジェクトを取得する (public member function) | |
| アクセサポリシーオブジェクトを取得する (public member function) | |
| この mdspan のマッピングが一意であるか(インデックスの全ての組み合わせが異なる基になる要素にマップされるか)を判定する (public member function) | |
| この mdspan のマッピングが網羅的であるか(基になる全ての要素が何らかのインデックスの組み合わせでアクセス可能か)を判定する (public member function) | |
| この mdspan のマッピングがストライドを持つか(各次元で、インデックスをインクリメントすると毎回同じ数の基になる要素をスキップするか)を判定する (public member function) | |
| [static] |
この mdspan のレイアウトマッピングが常に一意であるかを判定する (public static member function) |
| [static] |
この mdspan のレイアウトマッピングが常に網羅的であるかを判定する (public static member function) |
| [static] |
この mdspan のレイアウトマッピングが常にストライドを持つかを判定する (public static member function) |
[編集] 非メンバ関数
| (C++23) |
mdspan に対する std::swap アルゴリズムを特殊化する (function template) |
サブビュー | |
| (C++26) |
既存の mdspan のサブセットのビューを返す(function template) |
| (C++26) |
既存の extents とスライス指定子から新しい extents を作成する (function template) |
[編集] ヘルパー型とテンプレート
| (C++23) |
あるランクの多次元インデックス空間の記述子 (class template) |
| (C++23)(C++26) |
全てが動的な std::extents のための便利なエイリアステンプレート (alias template) |
| (C++23) |
mdspan の要素へのインデックス付きアクセスのための型(class template) |
| (C++26) |
mdspan の要素へのアラインメントされたアクセスのための型(class template) |
レイアウトマッピングポリシー | |
| (C++23) |
列優先の多次元配列レイアウトマッピングポリシー。最も左のエクステントがストライド 1 を持つ(class) |
| (C++23) |
行優先の多次元配列レイアウトマッピングポリシー。最も右のエクステントがストライド 1 を持つ(class) |
| (C++23) |
ユーザー定義のストライドを持つレイアウトマッピングポリシー (class) |
| (C++26) |
最も左のエクステント以上になることができるパディングストライドを持つ、列優先のレイアウトマッピングポリシー (class template) |
| (C++26) |
最も右のエクステント以上になることができるパディングストライドを持つ、行優先のレイアウトマッピングポリシー (class template) |
サブビューヘルパー | |
| (C++26) |
指定されたエクステント内のインデックスの全範囲を記述するスライス指定子タグ。 (tag) |
| (C++26) |
オフセット、エクステント、ストライドによって示される、等間隔のインデックスの集合を表すスライス指定子 (class template) |
| (C++26) |
submdspan_mapping のオーバーロードの戻り値の型(class template) |
[編集] 推論補助
[編集] ノート
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__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) |
連続したオブジェクトのシーケンスに対する所有権を持たないビュー (class template) |
| 数値配列、配列マスク、配列スライス (class template) |