C++20特性-------std::span

概述

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

美丽的欣情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值