std::mdspan
来自 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
的特化是 TriviallyCopyable 类型,如果它的 accessor_type
、mapping_type
和 data_handle_type
是 TriviallyCopyable 类型。
内容 |
[编辑] 模板参数
T | - | 元素类型;既不是抽象类类型也不是数组类型的完整对象类型。 |
Extents | - | 指定维数、大小以及哪些在编译时已知。必须是 std::extents 的特化。 |
LayoutPolicy | - | 指定如何将多维索引转换为底层一维索引(列主 3D 数组、对称三角 2D 矩阵等)。必须满足 LayoutMappingPolicy 的要求。 |
AccessorPolicy | - | 指定如何将底层一维索引转换为对 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 |
[编辑] 成员对象
名称 | 定义 |
acc_ (私有) |
类型为 accessor_type 的访问器(仅供说明目的的成员对象*) |
map_ (私有) |
类型为 mapping_type 的布局映射(仅供说明目的的成员对象*) |
ptr_ (私有) |
类型为 data_handle_type 的底层数据句柄(仅供说明目的的成员对象*) |
[编辑] 成员函数
构造 mdspan (公共成员函数) | |
分配 mdspan (公共成员函数) | |
元素访问 | |
访问指定多维索引处的元素 (公共成员函数) | |
观察者 | |
[静态] |
返回 mdspan 的秩(公共静态成员函数) |
[静态] |
返回 mdspan 的动态秩(公共静态成员函数) |
[静态] |
返回 mdspan 在给定秩索引处的静态范围大小(公共静态成员函数) |
返回 mdspan 在给定秩索引处的范围(公共成员函数) | |
返回多维索引空间的大小 (公共成员函数) | |
检查索引空间的大小是否为零 (公共成员函数) | |
获取指定维度上的步长 (公共成员函数) | |
获取范围对象 (公共成员函数) | |
获取指向底层一维序列的指针 (公共成员函数) | |
获取映射对象 (公共成员函数) | |
获取访问器策略对象 (公共成员函数) | |
确定此 mdspan 的映射是否唯一(每个索引组合映射到不同的底层元素) (公共成员函数) | |
确定此 mdspan 的映射是否详尽(每个底层元素都可以通过某种索引组合访问) (公共成员函数) | |
确定此 mdspan 的映射是否为步长(在每个维度上,递增索引每次都会跳过相同数量的底层元素) (公共成员函数) | |
[静态] |
确定此 mdspan 的布局映射是否始终唯一 (公共静态成员函数) |
确定此 mdspan 的布局映射是否始终详尽 (公共静态成员函数) | |
确定此 mdspan 的布局映射是否始终为步长 (公共静态成员函数) |
[编辑] 非成员函数
(C++23) |
专门针对 mdspan 的 std::swap 算法 (函数模板) |
子视图 | |
(C++26) |
返回对现有 mdspan 的子集的视图(函数模板) |
(C++26) |
从现有范围和切片说明符创建新的范围 (函数模板) |
[编辑] 辅助类型和模板
(C++23) |
某些秩的多维索引空间的描述符 (类模板) |
(C++23)(C++26) |
方便的别名模板,用于全动态 std::extents (别名模板) |
(C++23) |
用于对 mdspan 元素进行索引访问的类型(类模板) |
布局映射策略 | |
(C++23) |
列主多维数组布局映射策略;最左边的范围步长为 1 (类) |
(C++23) |
行主多维数组布局映射策略;最右边的范围步长为 1 (类) |
(C++23) |
具有用户定义步长的布局映射策略 (类) |
(C++26) |
具有填充步长的列主布局映射策略,填充步长可以大于或等于最左边的范围 (类模板) |
(C++26) |
具有填充步长的行主布局映射策略,填充步长可以大于或等于最右边的范围 (类模板) |
子视图辅助函数 | |
(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 |
202403L | (C++26) | std::mdspan 填充布局 |
[编辑] 示例
可以在 编译器资源管理器 上预览。
运行此代码
#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) |
对连续对象序列的非拥有视图 (类模板) |
数值数组、数组掩码和数组切片 (类模板) |