C++中STL的sring类常用接口及其源码解析

1. 为什么会有string类?

C语言中的字符串 C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可 能还会越界访问。

1.1官方介绍

cplusplus.com/reference/string/string/?kw=string

1. 字符串是表示字符序列的类

2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作 单字节字符字符串的设计特性。

3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信 息,请参阅basic_string)

4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits 和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。

5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个 类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。 

2.string类中的常用接口

2.1常用构造

void Teststring()
{string s1; // 构造空的string类对象s1string s2("hello bit"); // 用C格式字符串构造string类对象s2string s3(s2); // 拷贝构造s3
}

2.2 常用容量操作

1.size(重点) 返回字符串有效字符长度

2.length 返回字符串有效字符长度 capacity 返回空间总大小

我们更常用size,length是历史遗留的函数,为了与后面的容器统一所以用size

3.empty (重点) 检测字符串释放为空串,是返回true,否则返回false

4.clear (重点) 清空有效字符

clear()只是将string中有效字符清空,不改变底层空间大小。

5.reserve (重点) 为字符串预留空间

reserve改变string对象中的_capacity属性,使用场景:当知道string大概有多长时,可以使用reserve先扩大,就可以减少频繁开空间带来的消耗,提高效率。

6.resize (重点) 将有效字符的个数该成n个,多出的空间用字符c填充 

6.1 用于将字符串的大小调整为n个字符的长度,改变string对象中的_size属性,当n>_capacity,_capacity也会扩容。

用法:当写入第二个参数char c还可以初始化调整后的内容,原先的字符内容会保留,多的size会被填充为 char c

6.2 删除内容,resizen < 原先的size,会删除多的内容,但是底层容量不变

7.capacity

7.1 capacity会比实际的空间要小一个字节,有多一个预留给\0的,这里现有容量实际上是16字节

7.2 capacity返回string类对象的_capacity属性,也就是对象的现有容量。这个属性与size不同,size是现有成员的个数,capacity是现有容量大小,当size = capacity时,对象会扩容。这是为了避免每次添加字符时都要重新分配内存,提高性能。

7.3 在vs2022有点需要注意,对于长度不大的string类对象,其字符串是建在栈上的,长度大的string类对象是建在堆上的。

8. max_size

从字面意思上是string开辟的最大成员个数,但实际上string都开不到这么大的空间

2.3 string类对象的访问及遍历操作

  1. operator[] (重 点) 返回pos位置的字符,const string类对象调用

  2. begin+ end begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器

  3. rbegin + rend begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器

  4. 范围for C++11支持更简洁的范围for的新遍历方式

2.4 string类对象的修改操作

  1. push_back 在字符串后尾插字符c

  2. append 在字符串后追加一个字符串

  3. operator+= (重点) 在字符串后追加字符串str c_str(重点) 返回C格式字符串

  4. find + npos(重点) 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置

  5. rfind 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置

  6. substr 在str中从pos位置开始,截取n个字符,然后将其返回

  7. string::npos 字面意表示字符最大长度,数值等于 -1

注意:

1. 在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般 情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。

2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好

5. string类非成员函数

  1. operator+ 尽量少用,因为传值返回,导致深拷贝效率低
  2. operator>> (重点) 输入运算符重载
  3. operator<< (重点) 输出运算符重载
  4. getline (重点) 获取一行字符串
  5. relational operators (重点) 大小比较

3.VS与g++下string类的不同之处

3.1vs下string的结构

string总共占28个字节,内部结构稍微复杂一点,先是有一个联合体,联合体用来定义string中字 符串的存储空间: 当字符串长度小于16时,使用内部固定的字符数组来存放 当字符串长度大于等于16时,从堆上开辟空间

union _Bxty
{ // storage for small buffer or pointer to larger onevalue_type _Buf[_BUF_SIZE];pointer _Ptr;char _Alias[_BUF_SIZE]; // to permit aliasing
} _Bx;

这种设计也是有一定道理的,大多数情况下字符串的长度都小于16,那string对象创建好之后,内 部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高。

其次:还有一个size_t字段保存字符串长度,一个size_t字段保存从堆上开辟空间总的容量 最后:还有一个指针做一些其他事情。 故总共占16+4+4+4=28个字节两整数一指针一内容

3.2g++下string的结构

G++下,string是通过写时拷贝实现的,string对象总共占4个字节,内部只包含了一个指针,该指 针将来指向一块堆空间,

内部包含了如下字段: 空间总大小 字符串有效长度 引用计数

struct _Rep_base
{size_type _M_length;size_type _M_capacity;_Atomic_word _M_refcount;
};

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

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

相关文章

基于Mysql的商业辅助决策系统的设计与实现

TOC springboot295基于Mysql的商业辅助决策系统的设计与实现 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们…

机器学习/深度学习——关于分类任务的机器学习、深度学习模型的评估指标详解

机器学习/深度学习——模型的评估详解 搭配以下文章进行学习&#xff1a; 卷积神经网络&#xff1a; 深度学习——卷积神经网络&#xff08;convolutional neural network&#xff09;CNN详解&#xff08;一&#xff09;——概述. 步骤清晰0基础可看 深度学习——卷积神经网…

virtualbox 安装 win7 系统注意事项

win7可用ISO镜像 virtualbox安装Windows 7 64位旗舰版 &#xff08;包含镜像文件&#xff09;_virtual pc安装64位windows7-CSDN博客 视图设为了自动缩放&#xff0c;没有菜单了怎么办&#xff1f; 通过按右侧CtrlC/F/L进行切换 复制黏贴不公用怎么办&#xff1f; 宿主机有…

Word密码忘记怎么办?三个密码找回工具帮你轻松找回密码

在工作当中&#xff0c;为了保护文档内容的安全&#xff0c;我们时常会设置密码。但有时会因为长时间未打开而忘记了密码&#xff0c;导致word文档无法打开。面对这种情况&#xff0c;我们该怎么办呢&#xff1f;下面小编就将给大家带来3个实用的密码找回工具&#xff0c;帮助大…

XSS游戏前五关

分享一个XSS游戏的链接 XSS Game 第一关&#xff1a; 这边有一个innerHTML属性&#xff0c;我们查看官方文档 我们找到了它存在的漏洞&#xff0c;直接利用 https://sandbox.pwnfunction.com/warmups/ma-spaghet.html?somebody<img src1 onerror"alert(1337)&quo…

人工智能在子宫内膜癌领域的研究进展|顶刊速递·24-08-12

小罗碎碎念 本期推文主题&#xff1a;人工智能在子宫内膜癌领域中的研究进展 昨天的推文主要介绍的是卵巢癌&#xff0c;有一小部分涉及到了子宫内膜癌&#xff0c;按照最新的规划&#xff0c;今天的推文是与子宫内膜癌相关的。 从事妇科肿瘤研究的老师/同学&#xff0c;可以好…

stm32智能颜色送餐小车(openmv二维码识别+颜色识别+oled显示)

大家好啊&#xff0c;我是情谊&#xff0c;今天我们来介绍一下我最近设计的stm32产品&#xff0c;我们在今年七月份的时候参加了光电设计大赛&#xff0c;我们小队使用的就是stm32的智能送餐小车&#xff0c;虽然止步于省赛&#xff0c;但是还是一次成长的经验吧&#xff0c;那…

用Python读取Excel数据在PPT中的创建图表

可视化数据已成为提高演示文稿专业度的关键因素之一。使用Python从Excel读取数据并在PowerPoint幻灯片中创建图表不仅能够极大地简化图表创建过程&#xff0c;还能确保数据的准确性和图表的即时性。通过Python这一桥梁&#xff0c;我们可以轻松实现数据自动化处理和图表生成&am…

时空自回归模型(STAR)及 Stata 具体操作步骤

目录 一、引言 二、文献综述 三、理论原理 四、实证模型 五、稳健性检验 六、程序代码及解释 附录 数据预处理 生成时空权重矩阵 一、引言 时空自回归模型&#xff08;Spatial-Temporal Autoregressive Model&#xff0c;简称 STAR&#xff09;在分析具有时空特征的数…

【Python养成】:输出两个等腰三角形且平行方向

项目场景&#xff1a; 遇到一个小小的高中小程序题目&#xff0c;有趣就做 了一下&#xff0c;供大家参考。 问题描述 要求使用python编程&#xff0c;实现如下图形。 原因分析&#xff1a; 其实就是 找规律和找空格。先左边后右边。具体解释可以找AI。太简单了没必要亲自讲解…

【C++进阶】map与set的封装实践

文章目录 map和setmapmap的框架迭代器operator()operator--()operator()和operator!()operator*()operator->() insertbegin()end()operator[] ()map的所有代码&#xff1a; set的封装迭代器的封装总结 map和set 通过观察stl的底层我们可以看见&#xff0c;map和set是通过红…

密码学基础---椭圆曲线一文打尽

1.ECC简介及密钥生成 当前公认安全有效的三大类公钥密钥体制分别为基于大数因子分解难题(RSA)、离散对数难题(DSA)和椭圆曲线离散对数&#xff08;ECC&#xff09;难题的密码体制。 最初RSA由于其容易理解被广泛运用&#xff0c;但随着计算机性能的提升&#xff0c;要保证RS…

Golang | Leetcode Golang题解之第336题回文对

题目&#xff1a; 题解&#xff1a; // 哈希表实现 class Solution {public List<List<Integer>> palindromePairs(String[] words) {List<List<Integer>> res new ArrayList<>();int n words.length;Map<String, Integer> indices ne…

AIGC:clip-interrogator

文字生成图片是近年来多模态和大模型研究的热门方向&#xff0c;openai提出的CLIP提供了一个方法建立起了图片和文字的联系&#xff0c;但是只能做到给定一张图片选择给定文本语义最相近的那一个&#xff0c;实际项目开发中我们总是需要从一张图片获取描述&#xff0c;clip-int…

高效录制新选择:2024年Windows录屏软件

录屏能帮助我们捕捉屏幕上的精彩瞬间&#xff0c;作为老师可以用来录制课程&#xff0c;作为会议记录员可以用来录制远程会议。那么有什么软件是适合windows录屏的呢&#xff1f;这次我们一起来探讨一下吧。 1.福昕录屏大师 链接&#xff1a;www.foxitsoftware.cn/REC/ 这款软…

什么是链表/双向链表

看csp j选择的时候看到链表题&#xff0c;那就来写一写吧 什么是链表 首先我们知道数组&#xff1a; 链表和数组有点像&#xff0c;他是这样的&#xff1a; 1----->2------->3------->4 链表中每个数据都有一个指针&#xff0c;指着自己的下一项数据是哪一个 比如…

Android高版本抓包总结

方案1 CharlesVirtualXposedJustTrustMe 推荐使用三星手机此方案 VirtualXposed下载链接&#xff1a;https://github.com/android-hacker/VirtualXposed/releases JustTrustMe下载链接&#xff1a;https://github.com/Fuzion24/JustTrustMe/releases/ 下载完成后使用adb命令…

编辑器和工具扩展

https://www.youtube.com/watch?vovpiYkYFlPM ui提示 检查资源的合法性

使用 Ollama 集成 GraphRag.Net:一步步教你如何实现

在当今的技术世界&#xff0c;人工智能 (AI) 正在以惊人的速度发展。对于开发者来说&#xff0c;使用最新的工具和框架来提升工作效率至关重要。而在 AI 领域&#xff0c;GraphRag.Net 作为一个强大的图算法框架&#xff0c;允许我们以高效的方式进行数据处理。同样&#xff0c…

【Java 并发编程】(二) 从对象内存布局开始聊 synchronized

对象的内存布局 首先抛出一个经典面试题: 一个 Object 对象占多大? 这里我用工具打印了出来, 发现是 “16bytes”, 也就是 16B; 为什么? 请继续往下看; 普通对象(除了数组), 由markword, 类型指针, 实例数据(就是对象里的成员), 对齐填充(整个对象大小要能被8B整数, 方便6…