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 
广告