概述

std::span 是一个轻量级的视图类型,用于表示一段连续的内存区域。它不拥有数据,而是提供对现有数组、容器或内存区域的非拥有(non-owning)视图。允许你在不复制数据的情况下处理这些数据。

关键特性

  • 非拥有std::span 不管理内存的生命周期,只提供对现有内存的视图。也就是说,它不负责分配或释放内存。
  • 灵活性std::span 可以用于数组、标准库容器(如 std::vector),甚至是普通的 C 数组。
  • 安全性:相比直接使用指针和大小,std::span 更加安全和方便,它提供了边界检查和更清晰的语义。

 基本用法

#include <span>
#include <vector>
#include <iostream>

int main() {
    // 使用 std::span 视图访问数组
    int arr[] = {1, 2, 3, 4, 5};
    std::span<int> span_array(arr);

    // 使用 std::span 访问 std::vector 的数据
    std::vector<int> vec = {10, 20, 30, 40, 50};
    std::span<int> span_vector(vec);

    // 遍历 span 中的元素
    for (int value : span_array) {
        std::cout << value << " "; // 输出: 1 2 3 4 5
    }
    std::cout << std::endl;

    for (int value : span_vector) {
        std::cout << value << " "; // 输出: 10 20 30 40 50
    }
    std::cout << std::endl;

    return 0;
}

主要功能

  1. 创建方式

    • 从数组创建:std::span<int> span(arr, 5);
    • 从标准容器创建:std::span<int> span(vec);
    • 从指针和长度创建:std::span<int> span(ptr, length);
  2. 访问元素

    • 使用 operator[]span[0] 返回第一个元素。
    • 使用 front()back()span.front()span.back() 分别返回第一个和最后一个元素。
    • 使用 data()span.data() 返回指向数据开始位置的指针。
    • 使用 size()span.size() 返回视图中元素的个数。
  3. 子范围

    • std::span<int> subspan = span.subspan(1, 3); 创建一个从第 1 个元素开始、长度为 3 的子范围。

 

常见用途

  • 函数参数传递:当一个函数需要访问数组或容器的部分内容时,可以使用 std::span 作为参数,而不必传递额外的大小参数

void process_data(std::span<int> data) {
    for (int value : data) {
        // 处理数据
    }
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    process_data(arr);  // 传递整个数组
    process_data({arr + 1, 3});  // 传递数组的子范围
    return 0;
}
  •  简化内存管理:当你需要在多个函数之间传递一段内存区域,而不希望使用指针和手动管理长度时,std::span 提供了一种简单而安全的方式。

总结

std::span 是一个非常有用的工具,特别是在需要处理连续内存块而又不想复制数据的情况下。它提供了更好的安全性和代码可读性,使得处理数组和容器变得更加方便和直观。

 

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部