名稱空間
變體
操作

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 的特化的 accessor_typemapping_typedata_handle_typeTriviallyCopyable 型別,那麼它也是 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

[編輯] 資料成員

成員 描述
accessor_type acc_ (私有) 訪問器
(僅用於闡釋的成員物件*)
mapping_type map_ (私有) 佈局對映
(僅用於闡釋的成員物件*)
data_handle_type ptr_ (私有) 底層資料控制代碼
(僅用於闡釋的成員物件*)

[編輯] 成員函式

構造一個 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 元素進行索引訪問的型別
(類模板) [編輯]
用於對 mdspan 元素進行對齊訪問的型別
(類模板) [編輯]
佈局對映策略
列主序多維陣列佈局對映策略;最左側區段的步長為 1
(類) [編輯]
行主序多維陣列佈局對映策略;最右側區段的步長為 1
(類) [編輯]
具有使用者定義步長的佈局對映策略
(類) [編輯]
列主序佈局對映策略,其填充步長可以大於或等於最左側的區段
(類模板) [編輯]
行主序佈局對映策略,其填充步長可以大於或等於最右側的區段
(類模板) [編輯]
子檢視輔助項
一個切片說明符標籤,描述指定區段中索引的完整範圍。
(標籤)[編輯]
一個切片說明符,表示由偏移量、區段和步長指示的一組等距索引
(類模板) [編輯]
submdspan_mapping 過載的返回型別
(類模板) [編輯]

[編輯] 推導指引

[編輯] 注意

特性測試 標準 特性
__cpp_lib_mdspan 202207L (C++23) std::mdspan
__cpp_lib_submdspan 202306L (C++26) std::submdspan
202403L (C++26) std::mdspan 的帶填充佈局
__cpp_lib_aligned_accessor 202411L (C++26) std::aligned_accessor

[編輯] 示例

可在 Compiler Explorer 上預覽。

#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)
一個連續物件序列的非擁有檢視
(類模板) [編輯]
數值陣列、陣列掩碼和陣列切片
(類模板) [編輯]