C++ String类(上篇)
绪论
放弃时间的人,时间也会放弃他。——莎士比亚 ; 本篇章是关于string类内一些函数的介绍以及使用方法,都是我们编程必须掌握的基础!
全文共7000字左右.
话不多说安全带系好,发车啦(建议电脑观看)。
附:红色,部分为重点部分;蓝颜色为需要记忆的部分(不是死记硬背哈,多敲);黑色加粗或者其余颜色为次重点;黑色为描述需要
思维导图:
要XMind思维导图文件的话可以私信哈
目录
1.STL
2.string以及string的基本使用
2.1string的构造函数
2.2sting的赋值运算符重载
2.3string的append追加函数
2.4 string的+=运算符重载
2.5string的operator[ ]运算符重载
2.6迭代器iterator编辑
2.6.1逆向迭代器reverse_iterator
2.6.2 const_迭代器
3.string类对象的容量操作的接口函数
3.1reserve
3.2resize
3.3strink_to_fit
4.对string空间的元素访问的接口函数
4.1operator[]
5.修改string的内容的接口函数
5.1assign
5.2insert
5.3erase
6.对字符串操作的一些接口
6.1c_str
6.2find
6.3rfind
6.4 find_first_of 、find_last_of
7.string中的非成员函数重载
7.1一些常用的运算符函数重载
7.1.1比较类运算符重载
7.1.2string的 operator +
7.1.3 getline
7.2 把字符串与其他类型的相互转换
1.STL
知识点:
STL:是C++标准库的重要组成部分,不仅是一个可复用的组件库,还是一个包罗数据结构与算法的软件框架。
- STL有好几个版本:
- 原始版本,由惠普实验室的两位大佬完成的(也称为 HP 版本)
- P.J. 版本 : 它是由P.J. Plauger 开发完成的。继承自HP版本,后主要被微软使用,缺点:可读性低,符号命名奇怪
- RW 版本 ,后面因为竞争不过微软而倒闭(就不过多叙述)
- SGI 版本,继承自 HP 版本 ,被GCC(Linux)采用,可移植性强,命名风格和编程风格都比较好 , 有着良好的阅读性,后面我们主要学习这个版本的STL源码
- STL的六大组件
- 算法(swap、find、sort ...)
- 容器(数据结构)(string、vector、list、map ...)
- 迭代器(iterator、const_iterator 、....)
- 配接器(stack、queue、...)
- 空间配置器(内存池)(allocation)
- 仿函数(less、greater)
2.string以及string的基本使用
知识点:
string他像是一个数据结构,管理其字符串的增删查改
细节:
我们在学习的时候就主要学习其中比较重要的部分,因为对于这些库实现的是比较全面,可能有过多的分支,我们并不需要全部掌握,因为学的过多也不一定好事,我们只需要大概的有个印象即可,到时候假如要用到的时候,我们可以去查文档。
这里推荐一个可以查看c++文档的网址:https://cplusplus.com
本章主要通过代码实例的形式去掌握语法,我们需要多去使用这样才能更好的去记住他们
其中以下函数的使用方法和正常创建的类对象中的函数的使用方法是一样的,可以把 string 看成是一个类。
2.1string的构造函数
从上图可以发现,string的构造函数在库中重载的实现了很多种(后面还有许多的函数他们同样也都是重载了许多函数,并且其参数也差不多所以我们能类比的进行学习),他们都有对应的应用场景,我们可以根据不同的情况去对应着使用(但没必要全部都熟系掌握)。
功能:初始化对象
用法如下(请单击图片放大观看):
再通过实操来对其进行掌握(建议自己看后再写一遍),具体如下:
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<string> using namespace std;int main() {string st;//构造为空string st1("hello world");//将hello world字符串给对象string st2(st1);//拷贝构造st1给对象string st3(st1, 6, 5);//从st1 的下标为6的位置处向后的5个字符给对象string st4(st1, 6);//在第三个参数有缺省值,所以不一定需要写第三个参数npos是一个无符号的-1也就是整形的最大值,并且规定了此处的构造函数当npos的长度大于字符串的长度就会直接打印剩下的全部string st5("hello world",5);//提取c字符串中的前5个元素给对象string st6(10, ' * ');//创建10个*给对象cout << st <<endl;cout << st1 <<endl;cout << st2 <<endl;cout << st3 <<endl;cout << st4 <<endl;cout << st5 <<endl;cout << st6 <<endl;}
运行结果:
附:string的析构函数接口并不用调用,程序结束自动归还操作系统,所以就不写了
2.2sting的赋值运算符重载
功能:给类对象进行赋值操作
用法:对应着重载函数如下代码:
string st7("张三");string st8("李四");cout << st7 << endl;st7 = "张三丰";//赋值成一个字符串cout << st7 << endl;st7 = 'z';//赋值为一个字符cout << st7 << endl;st7 = st8;//拷贝构造cout << st7 << endl;
运行结果:
(可以把它当成内置类型一样的去使用)。
2.3string的append追加函数
功能:其重载的函数的大概用法和前面的构造函数重载的差不多,只不过此处是追加(就不一 一展示了,主要还是用到第3个,在this指针指向的对象后面追加字符串)。
具体如下:
2.4 string的+=运算符重载
功能:也是一个追加类型的函数(他比追加函数更加好用,一般就用+=替代append)
用法如下:
附:并且对于上面这些在后面增加字符的情况都不需要我们去判断是否需要扩容,编译器都会帮我们自动完成当申请空间不够时的扩容。
2.5string的operator[ ]运算符重载
功能:通过operator[ ] 运算符 ,我们就能自由的访问到对象字符串中的各个元素了。
具体如下:
附:
其中注意的是st.size()他和strlen() 用法是一样的都不算\0的,
并且因为其返回值是其引用,所以对于使用[ ]时我们就能去改变其中字符串的内容。
如下:此时我们用的就像内置类型一样,但是我们始终要记得他们底层是不一样的!
2.6迭代器iterator
- 迭代器类似于一个指针,可以用于任何容器,并且能对容器内的数据进行访问和修改
- 对此就要提之前讲过的范围for,其实范围for的底层就是用迭代器来实现的,所以说只要容器满足迭代器就能使用范围for。
- 对于算法来说他的本质是对数据进行修改的(排序的),但是因为容器(数据)类的对象都是私有的所以为了使用到其内部的数据,就需要借用迭代器。
- 证明其容器能使用迭代器
- 对此因为满足迭代器所以就能去用算法和范围for(reverse逆置算法的参数需要左闭右开的数据)
附:
其中的begin、end是用来找到字符串对象的开始和结尾的并且返回迭代器类型。
2.6.1逆向迭代器reverse_iterator
其用法几乎一样,但有几点需要去注意一下
在写开始的时候就需要用rbegin,结束处为rend,这样就能从后往前找数据
此时能很好的看出begin(rbegin)指向闭区间,而end(rend)指向开区间(没用的空间),所以对于逆向迭代器来说此时范围for就不行了,因为范围for的底层是一个正向的迭代器
具体如下:
2.6.2 const_迭代器
下面通过实际情况来进行对const_迭代器的解释:
此处出错的原因是因为传来的st是用const类型接收的所以不能用常规的迭代器const修饰即(对象是一个const类型时就需要用const_iterator)
此时就需要使用到const迭代器:
若是逆序的迭代器同理需要用加上const
下面是一些会更加具体的去写string
3.string类对象的容量操作的接口函数
知识点:
string并不属于容器,而是在标准库中的(因为string产生的比stl更早)
- 在stl中的数据个数用size表示,而在string是用来表示字符串的所以其表示长度用length,但是为了统一以及不修改源码(不删除length)的情况下,string下就既有size()又有length(),对此我们建议用size,size在其他容器中也有。size和length的用法是一样的,就是直接对象.size() / 对象.length()。
- max_size(); 函数是查看最大长度,但是因为不同编译器下用的版本不同就导致了其最大长度是不一样的这个接口对于我们的使用无意义基本不用。
- 同样的capacity()函数也是在不同编译器下是不同的,并且增长也会不同(在vs(PJ)下基本是1.5倍增长,Linux(SGI)下是2倍增长)
- clear( )函数(清理string中存的数据):把size变成0,capacity不变
细节:
3.1reserve()
![]()
功能:对string的容量进行自行的确定(可以申请空间也能缩小空间),一般应用于当我们知道需要用到多大的空间处,就能直接一次性的开辟怎么大的空间,避免再每次不够了再进行扩容(能一定的提高效率),并且此时申请的空间会大于等于所要申请的空间(像vs环境下就会多开一段,而centos7下就刚好和申请的空间一样)
具体如下:
在vs环境下进行开辟空间:
在Linux下:
当缩小空间时,是否会缩小的空间,看的是容器中是否还有数据,若有则不会缩小:
反之则缩:
3.2resize()
功能: 既能去申请空间,并且可以对申请的空间进行初始化(默认初始化为\0)
具体如下:
也可以指定初始化(也就是第二个重载函数的意义):
当他缩小空间时,他会先把超过范围的数据不算在内用\0隔开(相当于后面的数据给你删了):
附:综上所述,对于缩容情况来说,一般都是不会进行的,除了clear清除数据后的reserve缩容才进行了缩容,主要原因是缩容的效率是挺低的(它需要去先移动缩容后剩下的数据到新的空间处再进行把原位置的空间进行释放),并且现在的内存也挺多的并不会去怕内存不够这种情况所以就不为了内存而降低效率所以一般是不会缩容的。
3.3strink_to_fit()
功能:一个主动缩小空间的接口,将capacity减到合适的大小,一般把capacity减小到size大小或者比size大一些的值 (但注意他也并不一定会缩小这是给编译器一个建议)
4.对string空间的元素访问的接口函数
4.1operator[]
功能:可以直接当成数组一样的去访问其string内部的元素,在上面已经实现过来就不再过多赘述了
他还可以用来访问了元素然后进行修改,具体如下:
当越界时会报出断言错误,而at()接口(其用法和 [ ] 一样就不写了用处也不大,有兴趣的可以查一下文档)则会报出异常错误。
5.修改string的内容的接口函数
5.1assign()
功能:进行赋值操作,将string内原有的值覆盖掉。
具体如下:
但其实我们平常并不喜欢用 而是喜欢直接用重载操作符 = ,但他完成一些=运算符重载函数完成不了的赋值方法如:上面的第2、4、5、6 的重载函数,此时他们有多个参数完成(而对于运算符=他只能有两个操作数)
5.2insert()
功能:在指定pos位置处插入数据
具体如下:
当要注意insert不要多用,其在非尾部插入效率都是比较低的
5.3erase()
功能:对指定位置处删除len个字符(若不写len则删除指定位置及其后面的所有字符因为缺省参数npos是一个非常大的值(整形最大值))
具体使用:
附:replace()是一个交换函数接口可以把指定的数据改变成想要的数据,但该函数接口并不常用,所以就不写了想了解可以查一下文档
6.对字符串操作的一些接口
6.1c_str()
功能:该函数是用来直接指向顺序表中的数组的(string实际是用一个顺序表来实现的)
有了这个函数就能去和c的接口函数合否则是c无法识别string类型的(因为有些C语言地方他只能和内置类型去对接 (FILE * fopen ( const char * filename, const char * mode );))
6.2find()
功能:从pow位置开始往后查找字符串/字符,并且返回第一次出现时的位置,若没找到则会返回npos(整形最大值)
具体使用方法如下:
补充一个函数接口:substr()
功能: 他能从指定pos位置开始往后len个字符的字符串放到string内并把这个string返回。
下面用这个两个函数来实现把一个网址划分成协议、域名、资源名(动态版无论什么网址都能进行分隔)
1 #include<iostream> 2 using namespace std;3 4 int main()5 {6 string s = "https://legacy.cplusplus.com/reference/string/string/find/";7 8 string protocol; 9 10 size_t pos1= s.find("://");11 if(pos1 != s.npos)12 {13 cout << s.substr(0,pos1) << endl;//参数pos1表示的是个数此时从0位置开始到pos1个就刚好是协议名14 }15 16 string domain;17 string uri;18 int pos2 = s.find('/',pos1+3);//可以确定开始的位置 W> 19 if(pos2 != s.npos)20 {21 cout << s.substr(pos1+3,pos2-(pos1+3)) << endl;22 cout << s.substr(pos2+1) << endl;23 }24 return 0;25 }
6.3rfind
其功能和find几乎一样只是反过来从后面往前找字符/字符串,就不赘述了。
6.4 find_first_of 、find_last_of
find_first_of:
功能:是在对象字符串中从前往后查看是否有参数中的字符(返回第一次出现的下标位置),若果有就返回其下标位置,若没有则返回npos
具体如下:
find_last_of :
功能:和 find_first_of 一样只不过此时是从后往前找
附还有类似相反的函数:find_first_not_of 以及 find_last_not_of :: 他们是用来查找参数字符中没有出现过的返回其下标、last同样只是反过来了从后面往后查找而已,同样当没有时就会返回npos
但其实他们都没有非常的有用,我们只需要了解一下,有函数能查找在字符串中出现、查找字符串中没出现过的字符(在参数字符串中的会一 一进行查找,当出现时就会返回第一次出现的字符的下标)
7.string中的非成员函数重载
7.1一些常用的运算符函数重载
知识点:
7.1.1比较类运算符重载
功能:在String中已经重载其比较的重载运算符,所以我们就直接使用这些来比较即可能直接当成内置类型一样的来使用(不过要注意的是其比较的底层还是重载运算符以及是用ASCII码来对应着比较的)
具体如下:
附:虽然string中有compare()比较函数但是,他并没用下面的这种方式好用就不去讲他了,主要就写下面这种运算符重载的方法。
7.1.2string的 operator +
功能:用法很简单,因为string他已经帮我们实现好了,所以只需要去直接用就好,就像内置类型的加法一样,他并不会改变加的变量,只是用该变量返回加好后的值(此处的加就是加上字符/字符串)。
具体如下:
7.1.3 getline
功能:读取一行的数据,遇到\n才会停止
在有些编译器下需要加上头文件:#include<string>
实例:一般用于当字符串中用空格分隔时,cout 、 printf 他们不能直接读取字符串时
具体如下:
7.2 把字符串与其他类型的相互转换
功能:用来将字符串和其他多种字符进行转换的。
stoi把字符串转化成整形,stol :... 长整形 ... 、to_string把某类型转化成字符串
重载函数如下:
其中to_string很简单就不讲了(看下面的例子就能看懂);那stoi举例(把字符串转化成整形)其中第一个参数是字符串,idx是表示从字符串的那个下标开始往后转换,而base表示的是转换成几进制的整形(后面的两个参数一般是不用管的)。
具体如下:
本章完。预知后事如何,暂听下回分解。
如果有任何问题欢迎讨论哈!
如果觉得这篇文章对你有所帮助的话点点赞吧!
持续更新大量C++细致内容,早关注不迷路。
相关文章:

C++ String类(上篇)
绪论 放弃时间的人,时间也会放弃他。——莎士比亚 ; 本篇章是关于string类内一些函数的介绍以及使用方法,都是我们编程必须掌握的基础! 全文共7000字左右. 话不多说安全带系好,发车啦(建议电脑观看&…...
nested exception is java.lang.NoClassDefFoundError
出现这种问题,一般都是jar有问题,排查是哪个jar包,重新导入maven仓库一下就行了,有的时候需要把原来仓库里的包删掉,重新打包,有的时候要切换分支,到其他分支打包。 打包时候没有打进去…...
科普:python怎么使用Pyinstaller模块打包成可执行文件
目录 1. 使用conda创建虚拟环境2. 列出所有虚拟环境查看是否创建成功3. 激活虚拟环境4. 安装Pyinstaller模块5. Pyinstaller模块常用参数6. 例子:Windows打包成单个文件并可使用命令行窗口并自定义文件logo 1. 使用conda创建虚拟环境 创建个虚拟环境来打包…...
企业级应用高性能可扩展架构设计
前言 马上又要618了,每年到了这个时候,商家就开始促销,价格低会吸引来超多用户,对系统来说就是更多的流量,技术上如何确保网站稳定运行,且不被超卖,同时还要让用户有个良好的购物体验。 12306…...

【安全架构】
概念 安全是产品的属性,安全的目标是保障产品里信息资产的保密性(Confidentiality)、完整性(Integrity)和可用性(Availability),简记为CIA。 保密性: 保障信息资产不被未…...

RabbitMq-高级
参考:https://blog.csdn.net/dingd1234/article/details/125032383 1 TTL TTL QUEUE 声明args TTL MESSAGE postmessage中设置 区别:过期消息会直接删除消息,过期队列若配置死信队列会移到死信队列 ps:同时配置两个已小的为准 2…...

iOS App的打包和上架流程
转载:iOS App的打包和上架流程 - 掘金 1. 创建账号 苹果开发者账号几种开发者账号类型 个人开发者账号 费用:99 美元/年(688.00元)协作人数:仅限开发者自己不需要填写公司的邓百氏编码( D-U-N-S Number…...
Net6中遇到的一个很奇葩的问题
先来看一段代码,是控制台应用程序 internal class Program{static void Main(string[] args){Test().Wait();}private static async Task Test(){await Task.Run(() >{Debug.WriteLine("线程内输出");});Debug.WriteLine("线程外输出");}}执…...
2940. 花坛的最小改变次数
Powered by:NEFU AB-IN Link 文章目录 2940. 花坛的最小改变次数题意思路代码 2940. 花坛的最小改变次数 题意 略 思路 首先需要区间查询gcd,想到st表 其次思路,固定左端点,二分右端点,找gcd与区间长度相等的右端点,个…...
安装源代码 QT 4.8.7
在centos7.9.2009 (Core)操作系统上,安装qt 4.8.7 查看centos版本:cat /etc/centos-release 安装g:sudo yum install gcc gcc-c g版本查看(gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)):g -v 先安装…...

PINN学习与实验之拟合sin(x)
首先给出数学上的知识。 1. 2. 3. 其次给出PINN最基础的理解与应用说明。 1.PINN中的MLP多层感知机的作用? 答:目的是用来拟合出我们需要的那个 常微分方程,即函数逼近器。 2.PINN中物理信息的作用? 答:用于约束MLP反向…...

Java中进制转换的两种方法你知道吗?
目录 十进制转其他进制 其他进制转十进制 实战: A进制转B进制 关于大数运算可以参考躲不掉的高精度计算,蓝桥杯必考_高精度算法在哪些比赛考_无忧#的博客-CSDN博客 十进制转其他进制 使用 Integer.toString(int n,int radix) 方法,该方法…...

Qemu搭建ARM Vexpress开发环境
Qemu搭建ARM Vexpress开发环境 文章目录 Qemu搭建ARM Vexpress开发环境Qemu简介QEMU安装前的准备工作QEMU 安装的两种方式通过网络在线安装源码编译安装源码获取QEMU依赖库安装编译安装 命令选项qemu的标准选项qemu显示选项网络属性相关选项kvm的网络模型 Ubuntu 双网卡&#x…...

JMM如何实现volatile写/读的内存语义
内存屏障类型表 StoreLoad Barriers是一个“全能型”的屏障,它同时具有其他3个屏障的效果。现代的多处理器大多支持该屏障(其他类型的屏障不一定被所有处理器支持)。执行该屏障开销会很昂贵,因为当前处理器通常要把写缓冲区中的数…...

Smali的使用技巧:快速定位Android应用程序中的关键代码
简述 Smali是一种Android应用程序的Dalvik虚拟机指令集汇编语言,用于编写和修改应用程序的DEX文件。通过编写和修改Smali代码,可以实现对Android应用程序的定制化和逆向分析。Smali语言类似于汇编语言,直接操作Dalvik虚拟机指令集。 Smali代…...

04_两种常见的网页反爬措施及应对方法
一、封禁IP地址反爬 1、应对思路: 理解这种反爬方法的含义:当我们用自己电脑的ip地址短时间,高频率访问某个具有此类反爬设置的网站,这种网站就会把我们的ip地址封禁,一般都是封24小时或者其他时间。解决方案:通过代理ip访问,这种方式只不过就是让你有了重新访问网页的…...
安装docker环境,并制作docker镜像
docker环境安装 进入linux虚机后,安装docker环境,制作docker镜像并运行,进入运行中的容器,查看挂载的日志或报告 1.安装docker sudo curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 2.使用docker仓库安装…...

MySQL数据库 – node使用
1 MySQL查询对象 2 MySQL查询数组 3 mysql2库介绍使用 4 mysql2预处理语句 5 mysql2连接池使用 6 mysql2的Promi 这里仅说明如何使用服务器连接数据库并进行操作。 预处理语句就是可以输入变量的语句(表现形式是有符号:?)。需…...
JAVA使用HTTP代码示例模板
以下是一个使用Java发送HTTP请求的示例代码: java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class HttpExample { public static void main(String[] args) { try…...

elementui tree 支持虚拟滚动和treeLine (下)
由于我之前没有发布过npm 包,这里还得现学一下。 参考资料: 链接: 如何写一个vue组件发布到npm,包教包会,保姆级教学链接: vue组件发布npm最佳实践 按照上面的步骤,我通过 vue-sfc-rollup 生成了项目,…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...