Z
ZHANK
STL 容器深入

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) 参数——零开销、不拥有、范围安全。