C++ 20新特性之std::span

💡 如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。

为什么要引入std::span

        在C++中,我们经常需要传递数组或容器的一部分给函数进行处理。通常的做法是使用指针和长度来表示数组的一部分,但这可能导致越界和难以维护的代码。C++ 20中新引入的std::span,则提供了一种更安全、更直观的方式来处理这种情况。

        实际上,std::span是一个非常实用的容器适配器,用于表示连续的内存区域。它并不直接拥有数据,而是提供了一种访问现有数组或容器元素的方式,增强了代码的灵活性和泛型性。std::span可以看作是对指针和长度对的一个类型安全、范围安全的封装,特别适合用于算法和接口设计中,以提高代码的可重用性和安全性。

std::span基础

        std::span<T>是一个模板类,其中T是元素的类型,它可以通过数组、标准库容器或其他任何提供迭代器的对象来构造。std::span有两个关键属性:一个是指向连续数据元素的指针,另一个表示元素数量的size_t值。这使得它可以安全地访问并操作数据范围内的元素,而不需要知道数据的具体存储方式。std::span提供了类似数组的接口,允许我们通过索引访问元素,并提供了size()、empty()、begin()、end()等成员函数来获取关于数据的信息。

        std::span的主要特点如下。

        1、非拥有性。std::span不拥有它所引用的数据,它只是一个视图。

        2、类型安全。std::span知道它所引用的数据的类型。

        3、边界检查。由于std::span知道数据的大小,因此可以在访问时执行边界检查。

        4、灵活性。std::span可以与数组、std::vector、std::array等容器一起使用。

std::span的使用

        创建一个std::span的对象有好几种方法,包括:默认构造函数、从数组构造、从指针和大小构造、从一对指针构造、从容器构造、具有指定大小的构造等。访问std::span中的元素有三种方法,分别为:通过索引访问元素、带有边界检查的访问元素方法at()、访问第一个和最后一个元素的front()/back()。

        下面的示例代码演示了这些方法的使用,可以作为参考。

#include <iostream>
#include <span>
#include <vector>
using namespace std;int main()
{// 默认构造函数span<int> emptySpan;// 输出:0cout << emptySpan.size() << endl;// 从数组构造int pNumber[]{10, 20, 30, 40, 50};span<int> arraySpan(pNumber);// 输出:10cout << arraySpan.front() << endl;// 从指针和大小构造int* pData = pNumber;span<int> ptrAndSizeSpan(pData, 3);// 输出:30cout << ptrAndSizeSpan[2] << endl;// 从一对指针(首尾指针)构造span<int> pairPtrSpan(pData, pData + 2);// 输出:20cout << pairPtrSpan[1] << endl;// 从容器构造vector<int> vctNumber = {66, 77, 88};span<int> containerSpan(vctNumber);// 输出:88cout << containerSpan.back() << endl;// 具有指定大小的构造(静态大小)span<int, 3> staticSizeSpan(pNumber);// 输出:20cout << staticSizeSpan[1] << endl;return 0;
}

        除了以上这些接口,std::span还可以用来生成一个新的std::span。subspan()函数可生成一个新的span,表示当前span中的一部分。first()函数返回span的前count个元素组成的span,last()函数返回span的后count个元素组成的span。

#include <iostream>
#include <span>
#include <vector>
using namespace std;int main()
{vector<int> numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};span<int> fullSpan(numbers);// 使用subspan()方法生成新span(从索引3开始,长度为4的新span)span<int> subSpan = fullSpan.subspan(3, 4);// 输出:3 4 5 6for(int num : subSpan)cout << num << " ";cout << endl;// 使用first()方法获取前几个元素的spanspan<int> span1 = fullSpan.first(3);// 输出:0 1 2for(int num : span1)cout << num << " ";cout << endl;// 使用last()方法获取后几个元素的spanspan<int> span2 = fullSpan.last(4);// 输出:6 7 8 9for(int num : span2)cout << num << " ";cout << endl;return 0;
}

注意事项

        1、std::span不拥有数据,因此不能延长其生命周期。当底层数组或容器销毁时,std::span变为悬挂引用,使用它将导致未定义行为。

        2、尽管std::span提供了丰富的接口,但它不支持直接改变大小或直接插入/删除元素,因为它是对现有数据的视图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/28722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

『C++11』基础新特性

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前言 自从C98以来&#xff0c;C11无疑是一个相当成功的版本更新。它引入了许多重要的语言特性和标准…

ADS基础教程21 - 电磁仿真(EM)模型的远场和场可视化

模型的远场和场可视化 一、引言二、操作步骤1.定义参数2.执行远场视图&#xff08;失败案例&#xff09;3.重新仿真提取参数 三、总结 一、引言 本文介绍电磁仿真模型的远场和场可视化。 二、操作步骤 1.定义参数 1&#xff09;在Layout视图&#xff0c;工具栏中点击EM调出…

【递归、搜索与回溯】综合练习二

综合练习二 1.组合2.目标和3.组合总和4.字母大小写全排列 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.组合 题目链接&#xff1a;77. 组…

RabbitMQ实践——定制一致性Hash交换器的路由字段

大纲 Property法定制交换器绑定队列测试 Header法定制交换器绑定队列测试 参考资料 在《RabbitMQ实践——利用一致性Hash交换器做负载均衡》一文中&#xff0c;我们熟悉了一致性Hash交换器的使用方法。默认的&#xff0c;它使用Routing key来做Hash的判断源。但是有些时候&…

Maven 快速入门

Maven 简介 Maven是apache旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具。 依赖管理 方便快捷的管理项目的依赖资源(jar包),避免版本冲突 配置 依赖: 指当前项目运行所需要的(jar包) 在pom.xml 中编写<dependencies> 标签 在<dependencies…

线程池监控是怎么做的?

引言&#xff1a;在现代软件开发中&#xff0c;线程池是一种重要的并发控制机制&#xff0c;它能有效管理和复用线程资源&#xff0c;提升系统的性能和响应速度。然而&#xff0c;随着应用规模的扩大和复杂性的增加&#xff0c;对线程池进行有效监控显得尤为重要。线程池监控不…

bellman-ford——AcWing 853. 有边数限制的最短路99

bellman-ford 定义 贝尔曼-福特&#xff08;Bellman-Ford&#xff09;算法是一种用于在加权有向图中计算单源最短路径的算法。 运用情况 可以处理存在负权边的图。常用于找出图中从一个特定顶点到其他所有顶点的最短路径。 注意事项 时间复杂度相对较高。如果图中包含从源…

计算机毕业设计Django+Vue.js考研推荐系统 考研分数线预测 中公考研爬虫 混合神经网络推荐算法 考研可视化 机器学习 深度学习 大数据毕业设计

Python数据分析与可视化期末项目报告 项目名称&#xff1a; 考研推荐系统数据分析与可视化 学 号&#xff1a; 姓 名&#xff1a; …

【PHP开发工程师系统性教学】——thinkPHP的分页操作,不管有几页,用这个你想分几页就分几页

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

MoneyPrinterPlus:AI自动短视频生成工具,详细使用教程

MoneyPrinterPlus是一款使用AI大模型技术,一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上的轻松赚钱工具。 之前有出过一期基本的介绍&#xff0c;但是后台收到有些小伙伴说&#xff0c;不知道如何使用。 今天我将会手把手的详细介绍…

怎么加密U盘数据?U盘加密软件哪个好?

U盘是我们在生活和工作中最常用的移动存储设备&#xff0c;而为了避免U盘数据泄露&#xff0c;我们需要使用U盘加密软件来加密保护U盘数据。那么&#xff0c;U盘加密软件哪个好呢&#xff1f;下面我们就一起来了解一下吧。 BitLocker加密 BitLocker是Windows系统提供的磁盘加密…

多种传感器在钢铁工业安全风险监测预警中的应用

中国作为钢铁行业的生产与消费大国&#xff0c;其钢铁冶炼流程的复杂性和长周期性使得各环节中频繁出现的有毒有害、易燃易爆气体以及粉尘等危险物质成为行业安全管理的重大挑战。为了保障工作人员的安全&#xff0c;多种传感器在安全风险监测预警中的应用显得尤为重要。 钢铁产…

1732.找到最高海拔

有一个自行车手打算进行一场公路骑行&#xff0c;这条路线总共由 n 1 个不同海拔的点组成。自行车手从海拔为 0 的点 0 开始骑行。 给你一个长度为 n 的整数数组 gain &#xff0c;其中 gain[i] 是点 i 和点 i 1 的 净海拔高度差&#xff08;0 < i <n&#xff09;。请你…

java从红外图片提取温度,计算超过阈值的温度占总面积的百分比

灰度图是单通道图&#xff0c;像素只有一个值&#xff1a;灰度值。灰度值越高&#xff0c;则图像越亮。 现在我们已经知道我们看到一张灰度图是由许多不同灰度值的像素点构成&#xff0c;而每个像素就是一个越亮的像素&#xff0c;灰度值越高&#xff0c;最高值是255&#xff…

SQL server with方法修改

SQL server with方法修改&#xff0c;SQL 2008 不支持 with方法 需要改写下&#xff1a; WITH MonthsCTE AS ( 4 SELECT StartDate AS MonthStart 5 UNION ALL 6 SELECT DATEADD(month, -1, MonthStart) 7 FROM MonthsCTE 8 WHERE MonthStart > EndDate 9 ) 10 11 IN…

Latex的参考文献中显示三个问号???——解决办法

1、问题描述 在使用spring模板&#xff0c;并引用book时&#xff0c;末尾的引文地方出现三个???由于使用的bibtex是直接从谷歌学术中导出来的&#xff0c;其中仅包含作者&#xff0c;书名&#xff0c;出版社&#xff0c;年份等&#xff0c;缺少了重要的信息。结果导致在出版…

什么!没有Starter的阿里云OSS也能集成到SpringBoot?

实际上&#xff0c;我们在Maven存储库中尝试搜索阿里云OSS。在此过程中&#xff0c;我们会发现阿里云官方未提供一种集成Spring Boot的模式&#xff0c;即xxx-Springboot-Starter&#xff0c;显然&#xff0c;这是一个需要自行定制的组件。然而&#xff0c;如今许多企业在研发过…

LeetCode | 520.检测大写字母

这道题直接分3种情况讨论&#xff1a;1、全部都为大写&#xff1b;2、全部都为小写&#xff1b;3、首字母大写其余小写。这里我借用了一个全是大写字母的串和一个全为小写字母的串进行比较 class Solution(object):def detectCapitalUse(self, word):""":type …

【机器学习】计算机图形和深度学习模型NeRF详解(1)

1.引言 1.1.1. NeRF研究的背景 人们在拍照的时候&#xff0c;往往会中各个角度进行拍摄&#xff0c;以呈现出物体的全貌和美丽。下图的照片&#xff0c;拍摄的是一架楼梯&#xff0c;但是拍摄的角度完全不同&#xff1a; 我们可以看到这些图片都是楼梯的照片&#xff0c;但拍…

JavaScript语法糖:让代码更甜的10个技巧

JavaScript语法糖&#xff1a;让代码更甜的10个技巧 在JavaScript编程的世界里&#xff0c;“语法糖”&#xff08;Syntactic Sugar&#xff09;是一个亲切的术语&#xff0c;用于描述那些让代码更加简洁、可读性强的语法特性&#xff0c;而这些特性并不会增加语言的功能性&am…