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

ops/2024/9/24 13:24:29/

概述

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

 


http://www.ppmy.cn/ops/99014.html

相关文章

前端Array.reduce()函数延申用法

1.求和 // 求和const sum (arr) > arr.reduce((acc,cur) > acc cur,0)let arr [1,2,3,4,5]console.log(参数为&#xff1a;,arr);console.log(总和&#xff1a;,sum(arr)); 2.求积 //求积const sum1 (arr) > arr.reduce((acc,cur) > acc * cur,1)let arr1 …

VIT论文阅读: A Image is Worth 16x16 Words

简介 在2024年&#xff0c;大家都知道了transformer的故事&#xff0c;但是在4年前, CNN和Transformer谁才是CV的未来&#xff0c;还没有那么确定。 在简介部分&#xff0c;作者提到了一个令人失望的事实&#xff0c;在基于imagenet的实验中发现&#xff0c;transformer的表现…

【K8s】专题十二(2):Kubernetes 存储之 PersistentVolume

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 Linux 专栏 | Docker 专栏 | Kubernetes 专栏 往期精彩文章 【Docker】&#xff08;全网首发&#xff09;Kyl…

@PathVariable:Spring MVC中的路径变量解析

在Spring MVC中&#xff0c;PathVariable注解是一个非常重要的特性&#xff0c;它允许开发者将URL中的一部分作为参数传递给控制器&#xff08;Controller&#xff09;的方法。这种机制在处理RESTful风格的API时尤为有用&#xff0c;因为它使得URL更加简洁且富有表达力。本文将…

心得与体会

Loop本地回环 Loop本地回环&#xff0c;通常指的是以127开头的IP地址段&#xff08;127.0.0.1 – 127.255.255.254&#xff09;&#xff0c;其中127.0.0.1是最常用的一个地址&#xff0c;被称为本地回环地址&#xff08;Loop back address&#xff09;。这个地址不属于任何一个…

工厂模式与策略模式:理解与应用

工厂模式与策略模式&#xff1a;理解与应用 1. 引言2. 工厂模式简介2.1 定义2.2 特点2.3 应用场景2.4 工厂模式例子&#xff1a;咖啡制作 3. 策略模式简介3.1 定义3.2 特点3.3 应用场景3.4 策略模式例子&#xff1a;咖啡定价 4. 区别4.1 目的不同4.2 应用场景不同4.3 解决问题不…

开源模型应用落地-qwen2-7b-instruct-LoRA微调模型合并-Axolotl-单机单卡-V100(十)

一、前言 本篇文章将使用Axolotl去合并微调后的模型权重,通过阅读本文,您将能够更好地掌握这些关键技术,理解其中的关键技术要点,并应用于自己的项目中。 二、术语介绍 2.1. LoRA微调 LoRA (Low-Rank Adaptation) 用于微调大型语言模型 (LLM)。 是一种有效的自适应策略,…

easyexcel--导入导出实现自定义格式转换

自定义格式 我们在数据库设计的时候经常会有枚举类型&#xff0c;如0表示普通用户&#xff0c;1表示VIP用户等&#xff0c;这在excel导入的时候&#xff0c;我们会填普通用户而不是0&#xff0c;这样就需要用到自定义格式把普通用户转换成0&#xff0c;我写了一个通用的抽象类…