std::mdspan
來自 cppreference.com
定義於標頭檔案 <mdspan> |
||
template< class T, |
(C++23 起) | |
std::mdspan
是一個多維陣列檢視,它將多維索引對映到陣列的某個元素。對映和元素訪問策略是可配置的,並且底層陣列不要求連續,甚至根本不需要存在於記憶體中。
mdspan
的每個特化 MDS
都建模 copyable
且滿足
- std::is_nothrow_move_constructible_v<MDS> 為 true,
- std::is_nothrow_move_assignable_v<MDS> 為 true,且
- std::is_nothrow_swappable_v<MDS> 為 true。
如果 mdspan
的特化的 accessor_type
、mapping_type
和 data_handle_type
是 TriviallyCopyable 型別,那麼它也是 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 的佈局對映是否總是跨步的 (公開靜態成員函式) |
[編輯] 非成員函式
(C++23) |
為 mdspan 特化 std::swap 演算法 (函式模板) |
子檢視 | |
(C++26) |
返回一個現有 mdspan 的子集檢視(函式模板) |
(C++26) |
從現有的區段和切片說明符建立新的區段 (函式模板) |
[編輯] 輔助型別和模板
(C++23) |
某個秩的多維索引空間的描述符 (類模板) |
(C++23)(C++26) |
全動態 std::extents 的便捷別名模板 (別名模板) |
(C++23) |
用於對 mdspan 元素進行索引訪問的型別(類模板) |
(C++26) |
用於對 mdspan 元素進行對齊訪問的型別(類模板) |
佈局對映策略 | |
(C++23) |
列主序多維陣列佈局對映策略;最左側區段的步長為 1 (類) |
(C++23) |
行主序多維陣列佈局對映策略;最右側區段的步長為 1 (類) |
(C++23) |
具有使用者定義步長的佈局對映策略 (類) |
(C++26) |
列主序佈局對映策略,其填充步長可以大於或等於最左側的區段 (類模板) |
(C++26) |
行主序佈局對映策略,其填充步長可以大於或等於最右側的區段 (類模板) |
子檢視輔助項 | |
(C++26) |
一個切片說明符標籤,描述指定區段中索引的完整範圍。 (標籤) |
(C++26) |
一個切片說明符,表示由偏移量、區段和步長指示的一組等距索引 (類模板) |
(C++26) |
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) |
一個連續物件序列的非擁有檢視 (類模板) |
數值陣列、陣列掩碼和陣列切片 (類模板) |