命名空间
变体
操作

std::mdspan

来自 cppreference.com
< cpp‎ | container
 
 
 
 
在头文件 <mdspan> 中定义
template<

    class T,
    class Extents,
    class LayoutPolicy = std::layout_right,
    class AccessorPolicy = std::default_accessor<T>

> class mdspan;
(自 C++23 起)

std::mdspan 是对连续对象序列的视图,它将该序列重新解释为多维数组。

mdspan 的每个特化 MDS 都模拟 copyable 并满足

mdspan 的特化是 TriviallyCopyable 类型,如果它的 accessor_typemapping_typedata_handle_typeTriviallyCopyable 类型。

内容

[编辑] 模板参数

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 的布局映射是否始终为步长
(公共静态成员函数) [编辑]

[编辑] 非成员函数

专门针对 mdspan 的 std::swap 算法
(函数模板) [编辑]
子视图
(C++26)
返回对现有 mdspan 的子集的视图
(函数模板) [编辑]
从现有范围和切片说明符创建新的范围
(函数模板) [编辑]

[编辑] 辅助类型和模板

(C++23)
某些秩的多维索引空间的描述符
(类模板) [编辑]
(C++23)(C++26)
方便的别名模板,用于全动态 std::extents
(别名模板)[编辑]
用于对 mdspan 元素进行索引访问的类型
(类模板) [编辑]
布局映射策略
列主多维数组布局映射策略;最左边的范围步长为 1
(类) [编辑]
行主多维数组布局映射策略;最右边的范围步长为 1
(类) [编辑]
具有用户定义步长的布局映射策略
(类) [编辑]
具有填充步长的列主布局映射策略,填充步长可以大于或等于最左边的范围
(类模板) [编辑]
具有填充步长的行主布局映射策略,填充步长可以大于或等于最右边的范围
(类模板) [编辑]
子视图辅助函数
描述指定范围中所有索引的完整范围的切片说明符标签
(标签)[编辑]
表示一组按偏移量、范围和步长指示的规律间隔索引的切片说明符
(类模板) [编辑]
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)
对连续对象序列的非拥有视图
(类模板) [编辑]
数值数组、数组掩码和数组切片
(类模板) [编辑]