C++20 Span 简介
C++20 引入了 std::span
类模板, 它是一个轻量级的, 非拥有的范围视图, 用于表示连续的内存区域. std::span
可以用于数组, std::vector
, std::string
等数据结构, 提供了一种统一的方式来访问这些数据结构的元素.
std::span
首先不是一个容器, 而是一个视图, 它不拥有数据, 只是对数据的引用. 这使得 std::span
更加高效, 因为它不需要复制数据. std::span
可以用于函数参数, 允许函数接受任意大小的数组或容器, 而无需复制数据.
本文将介绍 std::span
的基本用法和一些示例.
创建 std::span
std::span
可以通过多种方式创建.在声明时指定了元素数量的是固定 span, 未指定大小的是动态 span. 动态 span 的大小可以随着对应容器大小的变化而变化, 而固定 span 的大小是固定的.
std::span
的操作
可以使用 first
和 last
方法获取 span 的前几个或后几个元素; 这里有两个版本:
first<N>()
和last<N>()
返回一个新的 span, 包含前 N 个或后 N 个元素. 是一个模板函数.first(N)
和last(N)
返回一个新的 span, 包含前 N 个或后 N 个元素.subspan(pos, count)
返回一个新的 span, 包含从位置 pos 开始的 count 个元素.
std::span
注意事项
std::span
不拥有数据, 只是对数据的引用, 因此在std::span
存在时, 数据必须保持有效.std::span
如果 span 的底层数据被销毁, 那么 span 将变成悬垂指针, 这是一种未定义行为.
总结
可以看出std::span
跟std::views
有很多相似之处, 实际上, std::span
是std::views
的一个特例.
关于 std::views
的更多内容可以查看我之前的博客: Modern C++ Ranges/View 库简介.