有时代码中不可避免要使用 C 风格数组,C++20引入std::span
来帮助我们避免使用 C 风格数组时会遇到的大部分问题。
可以像直接使用C风格数组那样使用std::span
,除此之外它有一个成员函数.size()
用于获取底层数组的大小,还有很多其他方便的功能。
std::span
并不拥有底层元素,只是提供一个轻量的包装器让我们以更友好的方式访问底层容器。
std::span
是一个视图(view)。“视图”(view)通常指的是一种不拥有底层数据的抽象,提供对某些数据的只读或只写访问,而不复制数据本身。视图用于高效地处理数据片段,而不引入不必要的开销。
例子:使用std::span
作为函数参数类型,接收C风格数组
如果不使用std::span
,C风格数组名在作为参数传入后,将衰减为指针,就无法再从其本身得知数组的大小。而使用std::span
,可以使用size()
成员访问其大小。
例子:使用std::span
作为函数参数类型,接收多种类型的容器
可以为任何其元素储存在连续内存区域的容器创建std::span
,如std::vector
,std::array
,或者其他合适的自定义类型。这样使用std::span
的目的是,能够为任何类型的数组创建简单、一致的接口。
例子:使用模板std::span
作为函数参数类型,接收多种类型的容器,指定容器中元素的类型
例子:从std::span
得到C风格数组
使用 data()
成员函数可以得到指向第一个元素的指针。
使用场景是,为接收C风格数组的函数提供参数。这种情况,通常还需要提供大小。
例子:从std::span
创建容器,使用迭代器
如果创建std::vector
是为了将其作为函数参数传递,那么可以像下面这样做,避免创建中间副本:
例子:使用.first()
, .last()
, .subspan()
创建子std::span
参考