C++中的std::string_view和std::span

2023-05-16

string_view是C++17标准引入,std::span是C++20引入,两个特性都比较类似。
(1)std::string_view
string_view是字符串的视图,由于传统的string存在以下问题:
字符串字面值、字符数组、字符串指针的传递仍要数据拷贝:字符串指针和字符数组某些情况下可能会比较大(比如读取文件的内容),此时会引起频繁的内存分配和数据拷贝,会严重影响程序的性能。
substr O(n)复杂度:每次都返回一个新生成的子串
效率较低,内存开辟在堆上。
因此引入了string_view来解决以上问题,Std::string_view只是获取字符串视图,并不真正创建或者拷贝字符串,只是拥有一个字符串查看功能
,不可写。它的原型是using std::string_view = std::basic_string_view
string_view仅保存指向数据起始指针和长度,开销较小。
构造函数:

constexpr string_view() noexcept;
constexpr string_view(const string_view& other) noexcept = default;
constexpr string_view(const CharT* s, size_type count);
constexpr string_view(const CharT* s);
string_view foo(string("abc"))

因为string类重载了string到string_view的转换操作符,所以也支持:string_view foo(string(“abc”));
自定义字面量:
比如\0对于字符串而言,有其特殊的意义,即表示字符串的结束,字符串视图,它关心实际的字符个数,所以可以自定义字面量。
成员函数:
跟string的只读函数基本一致,string_view的substr函数的时间复杂度是O(1),swap函数仅会修改string_view的数据指向,不会修改指向的数据。
使用注意事项:
1.string_view范围内的字符可能不包含\0,而cout输出需要以\0结尾的函数使用时可能会越界。
2.从[const] char*构造string_view对象时间复杂度O(n)
3.string_view指向的内容的生命周期可能比其本身短

string_view foo() {
    std::string s{"hello world"};
    return string_view{s};
}

(2)std::span
span 是一个轻量级的非拥有式容器,它提供了对连续内存的引用。 span 的主要用途是作为函数参数,可以避免不必要的内存拷贝,并且可以防止悬垂指针和空指针引用的问题。span和string_view非常类似,与是用于描述一段连续的内存序列,最大的作用是可以用于代替数组作为函数参数,如果把数组作参数时(非引用)会退化为指针,还得传递数组的长度。span,即可以用于读,也可以用于修改元素值(但不能增删元素),且代码更简单,更安全,不会越界。
span使用场景:
1.作为函数的参数,用于指示函数需要处理的数据范围;
2.作为类的成员变量,用于表示对象所管理的内存区域;
3.作为数组的视图,用于访问数组的一部分
使用方法:

数组转换为 span:
int arr[] = {1, 2, 3, 4, 5};
span<int> s(arr, 5);
遍历容器:
vector<int> vec = {1, 2, 3, 4, 5};
for (auto&& x : span(vec)) {
    cout << x << " ";
}
使用 span 来获取子序列:
int arr[] = {1, 2, 3, 4, 5};
span<int> s(arr, 5);
auto s1 = s.subspan(1, 3);
将 span 转换为其他容器类型:
int arr[] = {1, 2, 3, 4, 5};
span<int> s(arr, 5);
vector<int> vec(s.begin(), s.end());

span 与 array ,vector的区别
span 是 C++20 中新增的一个轻量级容器,用于表示一段连续的内存区域,它不负责管理内存空间,也不会拥有所指向内存的所有权,只是提供一种方便的方式来操作内存区域,因此可以看做是一个只读的“裸指针”。

与 array 和 vector 相比,span 的主要区别在于它不拥有自己的存储空间,而是引用了另一个数组或容器的内存空间。因此,当我们需要使用一个连续的内存块时,可以使用 span 来代替 array 或 vector。

具体来说,array 是一个固定大小的数组容器,其大小在编译时就确定了,不能动态改变。vector 是一个动态增长的数组容器,可以动态分配内存,并在需要时扩大容量。而 span 是一个非拥有型的容器,可以看作是一个指向连续内存区域的引用,可以指向任何类型的元素。

在使用方面,array 和 vector 可以用来存储数据,并通过下标或迭代器来访问其中的元素;span 则更多地用来表示一段内存区域,并提供类似于迭代器的操作来访问其中的元素(就是 只读),如 begin、end、rbegin、rend 等。
参考:
https://blog.csdn.net/danshiming/article/details/122653625
https://zhuanlan.zhihu.com/p/589182023
https://blog.csdn.net/Appleeatingboy/article/details/129314624

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中的std::string_view和std::span 的相关文章

随机推荐

  • NLP中的对抗训练

    目录 一 对抗训练的基本概念 二 NLP中常用对抗训练算法的pytorch版本实现 1 FGM Fast Gradient Method 2 PGD Projected Gradient Descent 3 FreeLB Free Larg
  • Flannel介绍

    本文个人博客地址 xff1a http www huweihuang com article flannel flannel introduction 一 flannel是什么 xff08 what xff09 xff08 一 xff09
  • 工作八年,月薪60K,裸辞两个月,投简历投到怀疑人生!

    近日 xff0c 有网友在某职场社交平台吐槽 xff0c 自己裸辞两个月了 xff0c 但是找工作却让自己的心态都要崩溃了 xff0c 全部无果 xff0c 不是已查看无回音 xff0c 就是已查看不符合 工作八年 xff0c 两年一跳 x
  • C语言判断某一年是否为闰年!三种实现程序代码(值得收藏)

    C语言判断某一年是否为闰年的各种实现程序代码 1 公历闰年计算原则 xff08 按一回归年365天5小时48分45 5秒 xff09 1 普通年能整除4且不能整除100的为闰年 xff08 如2004年就是闰年 1900年不是闰年 xff0
  • 祝天下所有程序员们,天天2020-1024快乐,程序员狂欢日燥起来!

    hello 程序员 xff01 hello world xff01 1GB 61 1024M xff0c 1M 61 1024K xff0c 1KB 61 1024B 1024 被认为是一个只有程序员才懂的数字 在这个特殊的日子里 有这么一
  • C语言期末基础知识大盘点!拒绝挂科,从我做起,争做别人家的娃!

    一 C语言基本常识 1 语言由函数组成 2 main是程序入口 3 C语言中不能出现中文或中文字符 xff08 注释和字符串除外 xff09 关键字 xff1a C语言提供表示特殊含义的单词 特点 xff1a 1 全部小写 xff1b 2
  • C语言小写转大写,小写字母转换成大写字母!

    在 C 语言中区分字母的大小写 xff0c 利用 ASCII 码中大写字母和小写字母之间的转换关系 xff08 差值为 32 xff09 xff0c 可以将小写字母转换为大写字母 编写程序实现 xff0c 从键盘上输入一个小写字母 xff0
  • 【C语言程序设计】C语言求亲密数!

    问题描述 如果整数A的全部因子 xff08 包括1 xff0c 不包括A本身 xff09 之和等于B xff1b 且整数B的全部因子 xff08 包括1 xff0c 不包括B本身 xff09 之和等于A xff0c 则将整数A和B称为亲密数
  • 盘点中国顶级黑客Top10,雷军也名列其中!

    第一名 xff1a 袁仁广 别名 xff1a 大兔子 datuzi xff0c 人称袁哥 提起袁任广 xff0c 知道的人或许并不多 但如果提起袁哥或者大兔子 xff0c 在国内安全业界称得上尽人皆知 在国内 xff0c 他的windows
  • 各互联网大厂办公室恋情政策盘点:禁止同部门,上下级是常态!

    互联网大厂的员工以年轻人居多 xff0c 非常容易在工作接触中产生感情 虽然 情不知所起 xff0c 一往而深 xff0c 但却不是每家公司都能理解和包容办公室恋情 xff0c 甚至还会出现 棒打鸳鸯 的冷酷现象 看完这几家大厂的政策 xf
  • 最大信息系数(MIC)——大数据时代的相关性分析

    在信息爆炸的当今社会 xff0c 单靠人力已经不能在无穷无尽的数据中有效的捕获信息 数据挖掘这一学科的兴起也预示着在各行业即将展开一场数据革命 在大数据集中识别两个变量的相关关系越来越重要 数据的相关性又分为线性相关和非线性相关 利用Pea
  • C语言开发《扫雷》游戏,你从未体验过的联网对战版

    一 简介 单机版扫雷总会有些枯燥 xff0c 不妨试试联网对战版扫雷 xff01 开发环境 xff1a VS2019 43 EasyX 20210224 游戏玩法 xff1a 左键按下翻开方块 xff0c 翻开雷判输 xff0c 或翻开最后
  • C语言趣味小游戏开发《找方块》!测试你眼力见的时候到了~

    程序介绍 该程序是仿照最近网上流行的找方块游戏编写的 xff0c 虽然没有仿照的一模一样 xff0c 但是也实现了他的一些功能 个人觉得可玩性还是挺高的 xff0c 是一个不错的娱乐放松的游戏 编写简介 该游戏的编写还是挺容易的 xff0c
  • C语言高仿贪吃蛇大作战,800行代码就能实现,结尾有源码~

    这是一个贪吃蛇大作战类游戏 xff0c 修改特性为 AI 不互杀 xff1b 该程序有四个类 xff1a 蛇基类 SnakeBase xff0c 玩家类 Player xff0c AI 类 xff0c Game 类 xff1b SnakeB
  • 黑苹果10.15.2 安装总结记录

    先展示一下我这一次折腾的最终效果 xff1a 桌面显示正常 xff0c wifi正常 xff0c 核显正常 xff0c 蓝牙没弄 xff0c 声卡没弄 安装vs for mac xff0c 微信 xff0c 网易云音乐 xff0c 打开多个
  • docker容器技术基础入门

    docker容器技术基础入门 容器 Container 传统虚拟化与容器的区别Linux容器技术Linux NamespacesCGroupsLXCdocker基本概念docker工作方式docker容器编排 容器 Container 容器
  • C++中的future和promise使用方法

    future和promise C 43 43 11中std future提供了一种访问异步操作结果的机制 异步操作不能马上就获取操作结果 xff0c 只能在未来某个时候获取 xff0c 但可以以同步等待的方式来获取结果 xff0c 可以通过
  • select、poll、epoll简介

    select poll epoll都是IO多路复用机制 xff0c 都可实现同时监听多个I O事件的状态 xff0c 多路复用就是通过一种机制监视多个描述符 xff0c 一旦某个描述符读或者写就绪就能通知代码进行读写操作 本质他们都是同步I
  • 【无标题】

    pro git学习笔记 持续更新ing 感觉一直对git的了解不够深入 xff0c 每次都是用到什么功能现去找 xff0c 但这样每次查询都耗费时间并且可能出错 xff0c 索性将git系统性地学习一遍 xff0c 下面是记录的学习笔记 一
  • C++中的std::string_view和std::span

    string view是C 43 43 17标准引入 xff0c std span是C 43 43 20引入 xff0c 两个特性都比较类似 1 std string view string view是字符串的视图 xff0c 由于传统的s