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.
廣告