C++——String类的增删查改

news2024/12/23 21:09:20

目录

    

  前言

1.String类的增删查改

        1.1增

        实验代码:

         运行结果:

         实验代码:

        运行结果:​编辑

        1.2删 

        实验代码:

        结果: 

        1.3查找

练习:查找文件后缀

        运行结果: 

        1.4 改


  前言

        上篇博客中,我介绍了String类的基本成员函数,这些函数主要与其成员变量属性有关,接下来看一看它的增删查改接口函数。

1.String类的增删查改

        1.1增

增就是添加数据到对象中,在String类中共有四种增加数据的方式:

push_back(); 

append();

+=运算符;

inesrt();

1.对于push_back()来说,只能逐个字符逐个字符的添加;

2.对于append()函数来说,它可以有多种方式的添加:

        如上,append常用的就是上面红框框住的两种,一个是字符串,一个是字符对象; 

 3.对于+=重载运算符函数来说,它可以用于字符串的添加,也可以用于对象的添加;

4.对于insert函数来说,也是如此: 

实验代码:

	string s1 = "Hello";

//1.push_back接口,也是用于在尾部添加内容,不过一次只能添加一个字符!!!
	s1.push_back('c');
	s1.push_back('h');
	s1.push_back('y');
	s1.push_back('q');
	//s1.push_back("safsaf");	//报错!
	cout << s1 << endl;

	//2.append接口,可以在字符串尾部添加内容
	s1.append(" ");
	cout << s1 << endl;
	s1.append("!");
	cout << s1 << endl;
	s1.append("World!");
	cout << s1 << endl;

	//3.+=接口——运算符重载 ,作用:拼接功能,可以多个字符串对象之间的拼接,也可以拼接内容
	string s2 = "Tomorrow Hello!";
	string s3 = "WangYuan ";
	s3 += s2;
	cout << s3 << endl;
	s3 += "See You again";
	cout << s3 << endl;

 

 运行结果:

 

 实验代码:

	//insert函数功能
	
	string s1 = "Hello World!";
	string s2 = "xixi ";
	//用法1:在下标处插入字符串
	cout << s1.insert(0, "bit ")<<endl;
	cout << s1.insert(9, "bit ")<<endl;
	//用法2:在下标处插入字符对象
	cout << s1.insert(0, s2)<<endl;
	//用法3:在下标处插入字符串的前n个字符内容
	cout << s1.insert(18, "WangJunKai",11)<<endl;
	
	cout << "----------------------------------------------------------" << endl;

运行结果:

通过这四种添加数据的方式,我们可知:

1.+=的使用是最方便好用的,也是最快捷的。

2.push_back和append方式都是尾插数据,这对于底层是连续存储空间的数组来说,效率较高。

3.而insert函数可以在任意位置插入数据,任意位置则表明需要挪动数组的数据,因为数组挪动数据的时间复杂度为O(N),所以insert的使用效率是最低的,最不常用的。 


        1.2删 

删意味着是删除数据,它有两种函数可以删:

1.clear();——可以清理删除类对象的所有内容,使得该对象的数据为零

2.erase();——可以删除类对象任意位置的数据

        由于现在还没有深入学习iterator迭代器,所以我们常用的只有第一种,参数中pos位置不主动传参的话,默认是从下标0处删除数据,len表示要删除的长度,参数不主动传参的话,默认是删npos个。

        

        npos是一个静态成员变量,它的类型是size_t(底层是无符号整型),初值设为-1,而无符号整型的-1往往表示的正数的最大值42亿多,所以len=npos 表示长度会直到字符串结束。

        回到erase()中,len设置为npos,则表示默认删到字符串结束——从pos位置开始删除,一直删到字符串末尾!

 

实验代码:

//erase函数功能,该接口的参数全部是缺省参数,不给值就是全删,直到斜杆0为止
	
	string s1 = "Hello World!";
	string s2 = "xixi";
	string s3(s1);
	//常用用法1:在下标处删除n个字符内容,若要删的字符数超过字符串大小,则到'\0'自动停下
	cout << s1.erase(0, 3) << endl;
	cout << s2.erase(2, 2) << endl;
	cout << s3.erase() << endl;		//全部删除
	

结果: 

 


        1.3查找

 查找,就要用到find()了:

共有4种find方式,常用的有三种。 该函数的返回值返回类对象内容的下标位置处。

 

练习:查找文件后缀

//练习:查找后缀
	string s4;
	cin >> s4;		//输入test.cpp,就可以获取.cpp后缀
	size_t pos2 = s4.find('.');
	if (pos2 != string::npos) {
		string s5 = s4.substr(pos2);
		cout << s5;
	}

        通过输入带有点后缀的文件名称,通过pos2去寻找输入文件中的字符'.',找到后返回该字符下标位置处,通过使用substr()函数拷贝字符'.'后面的所有内容到新对象中。

 

        find()函数就是搭配各种函数进行底层的遍历查找,进而做想要做的事情。 

        find()是正着寻找,而rfind()——是用于倒着找想要寻找的字符或字符串内容。

        假设还是查找文件的后缀,如上我最后一次输入的是qqq.out.zip.war一长串文件名,我只想要拿到最后一个点及后面的内容,靠使用find()函数会很麻烦,而rfind()很快就能解决:

    string s6;
	cin >> s6;		//输入test.cpp,就可以获取.cpp后缀
	size_t pos3 = s6.rfind('.');
	if (pos3 != string::npos) {
		string s7 = s6.substr(pos3);
		cout << s7 << endl;
	}

运行结果: 

 

其实还有几个关于查找的扩展函数:

        有兴趣的话可以自行了解~ 

 


        1.4 改

        改的话,在第一篇讲String的时候就已经说了——String的遍历方式,我们想要修改类对象的数据,可以通过for循环+[ ]方括号遍历、也可以通过迭代器遍历修改。这里就不过多的讲解了,大家可以到下面这个文章中查看。

 C++之STL——String字符序列类(1)_那string是怎么实现一个对象里有多个有序字符的呢_橙予清的zzz~的博客-CSDN博客

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

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

相关文章

VisualStudio如何进行插件开发?

文章目录 0.引言1.工具准备2.创建插件项目&#xff08;VSIX&#xff09;3.自定义VSIX属性4.创建一个command命令5.设置command名称6.编写command功能7.调试插件8.安装插件 0.引言 使用Visual Studio插件可以极大地提升开发效率、提供更好的集成环境、丰富扩展生态系统、方便调试…

【团队协作开发】IDEA中Git新建自己的dev工作分支,合并到master主分支教程(极其简单,新手)

文章目录 一、创建新dev工作分支二、push到自己的远程dev工作分支三、工作分支合并到master主分支1、先切换到master主分支2、将远程工作dev分支的内容merge到当前master分支中3、将merge提交到远程master分支 一、创建新dev工作分支 创建完新dev分支以后将默认切换到新dev分支…

K8S 证书过期后,kubeadm 重新生成证书

前言 K8S 各个组件需要与 api-server 进行通信&#xff0c;通信使用的证书都存放在 /etc/kubernetes/pki 路径下&#xff0c;kubeadm 生成的证书默认有效为 1 年&#xff0c;因此需要定时更新证书&#xff0c;否则证书到期会导致整个集群不可用。 本篇文章主要介绍如何通过 k…

openGauss学习笔记-17 openGauss 简单数据管理-表达式

文章目录 openGauss学习笔记-17 openGauss 简单数据管理-表达式17.1 简单表达式17.2 条件表达式17.3 子查询表达式17.4 数组表达式17.5 行表达式 openGauss学习笔记-17 openGauss 简单数据管理-表达式 表达式类似一个公式&#xff0c;我们可以将其应用在查询语句中&#xff0c…

SpringMVC注解介绍(二)

目录 1.RequestPart上传文件 2.获取Cookie 1.使用CookieValue 3.获取Session 3.1SessionAttribute 4.设置Session 4.1HttpSession设置Session 5.获取Header 5.1RequestHeader 6.返回数据 1.返回Json对象 7.请求转发或请求重定向 7.1forward和redirect区别 7.2请求…

element的el-upload实现多个图片上传以及预览与删除

<el-form-itemlabel"实验室照片:"prop"labUrlList"v-if"ruleForm.labHave"><el-upload:action"urlUpload":headers"loadHeader"list-type"picture-card":file-list"ruleForm.labUrlList"class…

LabVIEW在IMAQ图像中手动选择多个ROI

LabVIEW在IMAQ图像中手动选择多个ROI 设计了一个VI&#xff0c;用于在图像上生成和叠加一系列感兴趣区域&#xff08;ROI&#xff09;&#xff0c;并在IMAQ图像控件中显示它们。想挑选其中的一些进行后续处理。可以在控件中手动选择 ROI 吗&#xff1f; 以编程方式生成的 ROI…

MYSQL练习二答案

练习2答案 构建数据库 数据库 数据表 answer开头表为对应题号答案形成的数据表 表结构 表数据 答案&#xff1a; 1、修改emp表中sal字段为salary SQL语句 ALTER TABLE emp change sal salary double结果&#xff1a; 2、查找年薪在20000到30000之间的所有员工信息并按照 工…

Vue中scoped样式

scoped样式&#xff1a; 作用&#xff1a;让样式在局部生效&#xff0c;防止冲突 写法&#xff1a;<style scoped> 目录结构: Student.vue: 中的背景颜色设置的orange橙色 <template><div class"demo"><h2>学生姓名&#xff1a;{{name}}<…

文本预处理——文本张量表示方法

目录 文本张量表示one-hot编码word2vecword embedding 文本张量表示 one-hot编码 word2vec word embedding

四,Eureka 第四章

2.1.3 增加依赖 <!--添加依赖--><dependencies><!--Eureka Server--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>&l…

uniapp app nfc读取IC卡数据

先勾选权限 判断当前设备是否支持NFC以及是否打开了NFC功能 var main plus.android.runtimeMainActivity(); var NfcAdapter plus.android.importClass("android.nfc.NfcAdapter"); var _nfcAdapter NfcAdapter.getDefaultAdapter(main); console.log(NFC,_nfcA…

43:Three.js - 中

一、相机 相机&#xff0c;类似于眼睛&#xff0c;用于在3D舞台中&#xff0c;放置在不同的位置&#xff0c;实现通过不同的角度观察物体。 查看 Three.js 的文档&#xff0c;可以看到 Camera 是一个抽象类&#xff0c;一般不直接使用&#xff0c;其他类型的 Camera 实现了这个…

循环链表的实现

循环链表简介 简单来说&#xff0c;单链表像一个小巷&#xff0c;无论怎么样最终都能从一端走到另一端&#xff0c;循环链表则像一个有传送门的小巷&#xff0c;因为循环链表当你以为你走到结尾的时候&#xff0c;其实你又回到了开头。循环链表和非循环链表其实创建的过程以及…

RS485自由转PROFINET网关连接扫码枪

捷米JM-RS485/232-PN(RS485转Profinet)将具有RS485/232接口、自由通信协议接口的设备与PROFINET相连&#xff0c;作为PROFINET现场总线系统的一个设备。 捷米JM-RS485/232-PN集成了一个2端口交换机。受支持的以太网服务&#xff1a;ping、arp、SNMP和LLDP。端口诊断。禁用端口…

MySQL HA:如何将“删库跑路”的损失降到最低

对于任何一个企业来说&#xff0c;数据安全的重要性是不言而喻的。我在开篇词中也曾经强调过&#xff0c;凡是涉及到数据的问题&#xff0c;都是损失惨重的大问题。 能够影响数据安全的事件&#xff0c;都是极小概率的事件&#xff0c;比如说&#xff1a;数据库宕机、磁盘损坏…

服务器用友数据库中了locked勒索病毒后怎么解锁数据恢复

随着信息技术的迅速发展&#xff0c;服务器成为现代企业中不可或缺的重要设备。然而&#xff0c;由于网络安全风险的存在&#xff0c;服务器在日常运作中可能遭受各种威胁&#xff0c;包括恶意软件和勒索病毒攻击。近日&#xff0c;我们收到很多企业的求助&#xff0c;企业的用…

influxdb数据转移到clickhouse,顺便记录一些influxdb的常用命令

其实应该先写个influxdb初探的&#xff0c;但是当时没有时间时间都用来养龟养鱼了还有摸鱼了。 本篇先讲我是如何将influxdb数据转移到clickhouse的&#xff0c;再记录influxdb的一些常用命令 1、influxdb数据转移到clickhouse influxdb不管是查询还是导出的数据格式都很麻烦…

快手内推(2024校招,社招)

校招 校招可以直接投递&#xff0c;如果想投递指定部门或岗位的可以私聊我。可以帮看简历和面试状态&#xff0c;加快推进。 内推码&#xff1a;vlxMTFNBS 专属内推链接&#xff1a;https://campus.kuaishou.cn/#/campus/jobs?codevlxMTFNBS 社招 社招内推私聊&#xff0c;可…

Ubuntu 安装 Gif 工具 -- Peek

Ubuntu 安装 Gif 工具 – Peek 一直想找一个 Ubuntu 下的录制 Gif 的工具&#xff0c;后来测试发现 Peek 非常舒服&#xff0c;推荐使用&#xff5e;&#xff5e;&#xff5e; 一、添加Peek的ppa源 sudo add-apt-repository ppa:peek-developers/stable二、更新源 sudo apt…