命名空間
變體
動作

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 概念,並且滿足

mdspanaccessor_typemapping_typedata_handle_type 皆為 TriviallyCopyable 類型,則該 mdspan 的特化式即為 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_ (私有) 存取器 (accessor)
(僅用於闡述的成員物件*)
mapping_type map_ (私有) 佈局映射 (layout mapping)
(僅用於闡述的成員物件*)
data_handle_type ptr_ (私有) 底層資料控制代碼 (data handle)
(僅用於闡述的成員物件*)

[編輯] 成員函式

建構一個 mdspan
(公開成員函式) [編輯]
指派一個 mdspan
(公開成員函式) [編輯]
元素存取
存取指定多維索引處的元素
(公開成員函式) [編輯]
觀察器
[靜態]
回傳 mdspan 的秩 (rank)
(公開靜態成員函式) [編輯]
回傳 mdspan 的動態秩
(公開靜態成員函式) [編輯]
回傳 mdspan 在給定秩索引處的靜態維度大小
(公開靜態成員函式) [編輯]
回傳 mdspan 在給定秩索引處的維度大小
(公開成員函式) [編輯]
回傳多維索引空間的大小
(公開成員函式) [編輯]
檢查索引空間的大小是否為零
(公開成員函式) [編輯]
取得指定維度上的跨度 (stride)
(公開成員函式) [編輯]
取得維度物件
(公開成員函式) [編輯]
取得底層一維序列的指標
(公開成員函式) [編輯]
取得映射物件
(公開成員函式) [編輯]
取得存取器策略物件
(公開成員函式) [編輯]
判斷此 mdspan 的映射是否為唯一(即每種索引組合是否皆映射至不同的底層元素)
(公開成員函式) [編輯]
判斷此 mdspan 的映射是否為詳盡(即每個底層元素是否皆能透過某種索引組合被存取)
(公開成員函式) [編輯]
判斷此 mdspan 的映射是否為跨距(即在每個維度中,遞增索引是否每次皆會跳過相同數量的底層元素)
(公開成員函式) [編輯]
判斷此 mdspan 的佈局映射是否總是唯一的
(公開靜態成員函式) [編輯]
判斷此 mdspan 的佈局映射是否總是詳盡的
(公開靜態成員函式) [編輯]
判斷此 mdspan 的佈局映射是否總是跨距的
(公開靜態成員函式) [編輯]

[編輯] 非成員函式

為 mdspan 特化 std::swap 演算法
(函式模板) [編輯]
子視圖 (Subviews)
(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)
連續物件序列上的非擁有型視圖
(類別樣板) [編輯]
數值陣列、陣列遮罩與陣列切片
(類別樣板) [編輯]
English Deutsch 日本語 中文(简体) 中文(繁體)