- mdspan[meta header]
- class template[meta id-type]
- std[meta namespace]
- cpp23[meta cpp]
namespace std {
template<
class ElementType,
class Extents,
class LayoutPolicy = layout_right,
class AccessorPolicy = default_accessor<ElementType>>
class mdspan;
}
- Extents[link extents.md]
- LayoutPolicy[link LayoutMappingPolicy.md]
- AccessorPolicy[link AccessorPolicy.md]
- layout_right[link layout_right.md]
- default_accessor[link default_accessor.md]
mdspanは、任意のメモリブロックに対して多次元配列のようにアクセスする機能を提供するクラスである。
mdspanそれ自体は参照先メモリブロックを所有せず、[]演算子を介して多次元配列のように見せかけるビュー(view)にすぎない。
クラスの名称mdspanは、1次元の範囲std::spanに対する多次元(MultiDimensional)拡張に由来する。
mdspanの特殊化MDSはcopyableのモデルであり、かつ
そのメンバ型accessor_type, mapping_type, pointerがトリビアルコピー可能であるとき、mdspanの特殊化もトリビアルコピー可能である。
mdspanクラスでは、テンプレートパラメータを介して多次元配列ビューをカスタマイズできる。
ElementType : 多次元配列ビューの要素型
Extents : 多次元配列の次元数(rank)と要素数(extent)
LayoutPolicy : 多次元配列インデクスと要素位置の対応関係
AccessorPolicy : 要素アクセス時の詳細挙動
mdspanクラスは、下記の説明専用メンバ変数を保持する。
acc_ : accessor_type型の要素アクセサ
map_ : mapping_type型のレイアウトマッピング
ptr_ : data_handle_type型のメモリブロックへのハンドル(ポインタ)
ElementTypeは抽象クラス型もしくは配列型のいずれでもない完全型であり、かつ
Extentsはextentsの特殊化であり、かつ
is_same_v<ElementType, typename AccessorPolicy::element_type>がtrueであること。
LayoutPolicyはレイアウトマッピングポリシー要件を満たし、かつAccessorPolicyはアクセサポリシー要件を満たすこと。
| 名前 |
説明 |
対応バージョン |
operator[] |
多次元配列の要素アクセス |
C++23 |
at |
多次元配列の要素アクセス |
C++26 |
| 名前 |
説明 |
対応バージョン |
swap |
2つのオブジェクトを入れ替える |
C++23 |
#include <mdspan>
#include <print>
int main()
{
double arr[] = {1, 2, 3, 4, 5, 6};
// メモリブロックに対する2x3要素の2次元配列ビューを作成
using Ext2x3 = std::extents<size_t, 2, 3>;
std::mdspan<double, Ext2x3> mat{arr};
// 2次元配列の各要素を表示
for (size_t i = 0; i < mat.extent(0); ++i) {
for (size_t j = 0; j < mat.extent(1); ++j) {
std::print("{} ", mat[i, j]);
}
std::println("");
}
}
- extent[link mdspan/extent.md]