std::span 视图
span 不拥有数据的数组视图、连续内存抽象、替代指针+长度
std::span 视图
std::span(C++20)是不拥有数据的数组视图——像 string_view 之于字符串,span 是连续内存的通用抽象。
学完本章你将: 掌握 span 替代指针+长度、连续内存抽象、与容器互操作。
为什么需要 span
cpp
// ❌ 旧式——指针 + 长度(安全隐患)
void process(int* data, size_t size) {
for (size_t i = 0; i < size; i++) { /* ... */ }
}
// ✅ span —— 统一接口
#include <span>
void process(std::span<int> data) {
for (int x : data) {
std::cout << x << " ";
}
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
process(arr); // ✅ 自动推导大小
std::vector<int> v = {6, 7, 8};
process(v); // ✅ vector 也兼容
process(std::span(v).subspan(1, 2)); // 子视图——不拷贝
}
span 的特性
cpp
std::span<int> s(arr);
s.size(); // 元素个数
s.size_bytes(); // 字节数
s.empty(); // 是否为空
s.front(); // 第一个元素
s.back(); // 最后一个元素
s[0]; // 下标访问
auto sub = s.subspan(1, 3); // 子视图 [1, 4)
auto first = s.first(3); // 前 3 个
auto last = s.last(2); // 后 2 个
💡 span 可以替代绝大多数
const vector<T>&和(T*, size)参数——零开销、不拥有、范围安全。