C++ 库 - <mdspan>



C++ 中的<mdspan>头文件用于处理数据的多维视图。它提供了一种高效的方式来访问多维数组或连续内存块,并具有灵活的映射布局。

此头文件是容器库的一部分,并且针对关键应用程序进行了优化,可以与不同的数据布局一起使用,例如(行主序、列主序)。

包含 <mdspan> 头文件

要在您的 C++ 程序中包含 <mdspan> 头文件,可以使用以下语法。

#include <mdspan>

<mdspan> 头文件的函数

以下是 <mdspan> 头文件中所有函数的列表。

序号 函数和描述
1 operator []

此函数访问指定多维索引处的元素。

2 size

此函数返回多维索引空间的大小。

3 empty

此函数检查索引空间的大小是否为零。

4 stride

此函数获取沿指定维度的步长。

5 extents

此函数获取 extents 对象。

6 data_handle

此函数获取指向底层一维序列的指针。

7 mapping

此函数获取定义多维索引如何映射到底层数据的映射对象。

8 accessor

此函数返回访问器策略对象,该对象管理对底层元素的访问。

访问元素

在下面的示例中,我们将使用 operator[],它允许 matrix[1][2] 访问第一行第二列的元素。

#include <mdspan>
#include <iostream>
int main() {
    std::array<int, 9> data = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    std::mdspan<int, std::extents<3, 3>> matrix(data.data());
    std::cout << "Element at [1][2]: " << matrix[1][2] << std::endl; 
    return 0;
}

输出

如果我们运行上面的代码,它将生成以下输出:

6

属性检查

属性检查是成员函数,提供有关对象的多分量映射行为的信息。

序号 函数和描述
1 is_unique

此函数确定此 mdspan 的映射是否唯一。

2 is_exhaustive

此函数确定此 mdspan 的映射是否详尽。

3 is_strided

此函数确定此 mdspan 的映射是否为步长型(在每个维度中,递增索引每次都跳过相同数量的底层元素)。

属性检查

在下面的示例中,我们将使用 is_unique() 函数来检查 mdspan 中的每个多维索引是否映射到一维数据数组中的不同元素。

#include <mdspan>
#include <iostream>
int main() {
    std::array<int, 9> data = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    std::mdspan<int, std::extents<3, 3>> matrix(data.data());
    if (matrix.is_unique()) {
        std::cout << "Mapping is unique." << std::endl;
    } else {
        std::cout << "Mapping is not unique." << std::endl;
    }
    return 0;
}

输出

如果我们运行上面的代码,它将生成以下输出:

Mapping is unique.

静态函数

静态函数提供 mdspan 及其映射布局的编译时属性。

序号 函数和描述
1 is_always_unique

此静态函数确定此 mdspan 的布局映射是否始终唯一。

2 is_always_exhaustive

此静态函数确定此 mdspan 的布局映射是否始终详尽。

3 is_always_strided

此静态函数确定此 mdspan 的布局映射是否始终为步长型。

检查编译时属性

在下面的示例中,我们将使用 is_always_exhaustive 来检查布局映射是否始终以连续方式覆盖 mdspan 的整个范围(编译时)。

#include <mdspan>
#include <iostream>
int main() {
    if (std::mdspan<int, std::extents<3, 3>>::is_always_exhaustive()) {
        std::cout << "Mapping is always exhaustive." << std::endl;
    } else {
        std::cout << "Mapping is not always exhaustive." << std::endl;
    }
    return 0;
}

输出

如果我们运行上面的代码,它将生成以下输出:

Mapping is always exhaustive.
广告