C++ 庫 - <span>



在 C++20 中,<span> 標頭檔案引入了 std::span 類模板,它提供了一種表示連續資料序列(例如陣列或向量)的方法,而無需複製或移動資料。

與傳統容器(如 std::vector 或 std::array)不同,span 不擁有其引用的資料。相反,它提供了一個檢視,這意味著它充當現有資料的輕量級包裝器,使其成為在需要傳遞陣列而不產生複製開銷的情況下使用的理想選擇。

包含 <span> 標頭檔案

要在您的 C++ 程式中包含 <span> 標頭檔案,可以使用以下語法。

#include <span>

<span> 標頭檔案的函式

以下是 <span> 標頭檔案中所有函式的列表。

序號 函式及描述
1 operator=

賦值 span。

2 begin

返回指向開頭的迭代器。

3 cbegin

返回指向開頭的常量迭代器。

4 end

返回指向結尾的迭代器。

5 cend

返回指向結尾的常量迭代器。

6 rbegin

返回指向開頭的反向迭代器。

7 crbegin

返回指向開頭的常量反向迭代器。

8 rend

返回指向結尾的反向迭代器。

9 crend

返回指向結尾的常量反向迭代器。

10 front

訪問第一個元素。

11 back

訪問最後一個元素。

12 at

訪問指定元素並進行邊界檢查。

13 operator[]

訪問指定元素。

14 data

直接訪問底層連續儲存。

15 size

返回元素數量。

16 size_bytes

返回序列的大小(以位元組為單位)。

17 empty

檢查序列是否為空。

18 first

獲取由序列的前 N 個元素組成的子 span。

19 last

獲取由序列的後 N 個元素組成的子 span。

20 subspan

獲取子 span。

從陣列建立 Span

在以下示例中,我們將從分配的陣列建立一個 span。

#include <iostream>
#include <span>
void a(std::span < int > x) {
   for (int b: x) {
      std::cout << b << " ";
   }
   std::cout << std::endl;
}
int main() {
   int array[] = {2,4,6,8};
   std::span < int > x(array);
   a(x);
   return 0;
}

輸出

以上程式碼的輸出如下:

2 4 6 8 

切片 Span

考慮以下示例,我們將切片一個 span 以建立其元素子集的檢視。

#include <iostream>
#include <span>
void a(std::span < int > x) {
   for (int b: x) {
      std::cout << b << " ";
   }
   std::cout << std::endl;
}
int main() {
   int array[] = {1,12,23,34,45};
   std::span < int > x(array);
   auto slice = x.subspan(2, 4);
   a(slice);
   return 0;
}

輸出

以下是以上程式碼的輸出:

23 34 45 0 
廣告