从零开学C++:string类

news2024/12/24 2:39:52

引言:现在我们将正式踏入C++起飞阶段C++语言自带的各种类能极大地简化我们所编写的代码的量,而我们今天要学的string就是其中之一。

更多有关C++的知识点详解可前往个人主页:计信猫​​​​​

一,认识string

        string其实很简单,我们可以简单地把它看成如下的代码实现的类:

class string
{
	char* _str;//存储字符串
	size_t _size = 0;//记录字符串的有效字符的个数
	size_t _capacity = 0;//记录string的空间大小
};

         所以显而易见,当我们想要储存一个字符串的时候,我们就可以使用string类来储存这个字符串,但前提是我们需要包含<string>的头文件。

 二,string类对象的常见构造方式

1,string()

        该方法构造的其实就是以空字符串来构造一个string类的对象。

2,string(const char* s)

        有了这个方式,所以我们就可以字符串的首元素的地址传给string,然后构造string类的对象,具体的方式如下:

int main()
{
	const char* str = "hello";
	string s1(str);
	string s2("hehe");
	return 0;
}

3,string(size_t n,char c)

        这样的string类的构造方式比较少见,它的意思是使用n个字符c来构成一个字符串,再以该字符串构造string类的对象

int main()
{
	string s3(3, 'h');//以字符串"hhh"来构造s3
	return 0;
}

 4,string(string const& s)

        该方式我们就见怪不怪了,这里就是利用了我们的拷贝构造函数来对我们的对象进行构造

int main()
{
	string s3(3, 'h');//以字符串"hhh"来构造s3
	string s4(s3);//使用拷贝构造函数构造s4
	return 0;
}

三,string类对象的容量的操作

1,size和capacity

        当我们想要知道我们的string类对象的有效字符个数的大小时,我们就可以使用size,使用方式如下:

int main()
{
	string s1("hhh");
	int count = s1.size();//获取了s1中有效字符的个数
	return 0;
}

        而与之相同的,当我们想要知道s1的空间总大小的时候,我们就可以使用s1.capacity()来获取s1的总空间大小

2,empty

        empty意为空的,所以如果对象中字符串为空,则该函数会返回true,反之则会返回false

3,clear

        clear意为清除,当我们使用clear函数时,那么此时对象当中的字符串就会被完全清除size会变为0,但是我们的空间总大小capacity并不会改变

4,reserve

        reserve函数会为string预留出空间的大小,相当于就是改变capacity的值,并且为string开出对应capacity的空间大小,但当我们reserve的值小于我们原本的capacity时,reserve不会改变容量大小

        所以我们可以理解为reserve只可以扩容,不可以缩容

int main()
{
	string s1("hhh");
	s1.reserve(10);//将s1的总空间大小变为10
	return 0;
}

5,resize

        resize可以改变string中有效字符的个数,我们将其分为两个部分来讲。

Ⅰ,将size变大

        那么此时我们就有两种方式:resize(size_t n)resize(size_t n, char c),两者都可以将stringsize变为n,但不一样的是,前者是使用‘0’来填充,而后者是使用字符c来进行填充。

Ⅱ,将size变小

        当我们想要将size变小时,那就意味着原来的字符串会被删除一部分,而我们的底层总空间capacity并不会改变。

四,string类对象的访问和遍历

1,operator[]

        在string类对象当中,我们就可以使用下标对字符串中某个特定位置的字符进行访问,我们就可以理解为将一个字符串拆开,然后一个一个地存放在字符数组当中了。

int main()
{
	string s1("hhh");
	char c = s1[1];//使用下标对s1进行访问
	return 0;
}

2,迭代器begin+end

        迭代器是我们新学的内容,在初级阶段我们就可以将它理解为一个指针begin指向字符串的首元素地址,而end指向字符串结尾的下一个地址。那么我们使用迭代器进行string类对象的遍历代码如下:

int main()
{
	string s1("hello world");
	string::iterator it = s1.begin();//创建一个迭代器it来遍历s1
	while (it != s1.end())
	{
		cout << *it;//打印
		it++;
	}
	return 0;
}

         那么代码一走,结果如下:

3,范围for

        范围for也是一种遍历string的方法,它的底层逻辑其实也就是迭代器,所以,只要可以使用迭代器的地方,就可以使用范围for来遍历。而范围for的遍历方式如下:

int main()
{
	string s1("hello world");
	for (auto ch : s1)
	{
		cout << ch;
	}
	return 0;
}

        其中auto的含义为自动,那么此时auto就会根据给ch赋值的变量的类型来自动变为对应的类型

五,string类对象的修改操作

1,push_back

        push_back函数的作用很简单,但也非常地常用,它可以在原string字符串的末尾再插入一个字符,试例如下:

int main()
{
	string s1("hello world");
	s1.push_back('a');//在字符串末尾添加一个字符a
	for (auto ch : s1)//使用范围for进行打印
	{
		cout << ch;
	}
	return 0;
}

        代码一走,结果如下:

2,append

        append跟前面所学的push_back很相似,两者都是在字符串末尾进行添加,但是append则专门针对于字符串的添加,而不是单个字符的添加。

3,operator+=

        operator+=这个字符串重载就比较常用了,它的作用也是连接一个字符串str在string字符串的末尾,而operator+=不仅可以针对单个字符,同时也可以针对一个字符串

4,c_str

        该函数则是用于返回string中的字符串的指针

5,find

        find(char c,size_t n)则是从string字符串的第n个位置开始向后寻找与c相同的字符,并立马停止且返回该字符的下标(n的缺省值为0),若没有找到,则会返回string::npos(一个很大的整数值)。

int main()
{
	string s1("hello world");
	int pos = s1.find('d');
	return 0;
}

6,substr

        substr(size_t pos,size_t len=npos)的作用是将从pos位置开始,长度为len的字符串内容取出,并且返回出来。当我们没有给len赋值时,系统则会默认将pos之后的所有字符取完并拿出来赋值

int main()
{
	string s1("hello world");
	string s2;
	s2 = s1.substr(6);//从s1中的下标为6的位置开始向后截取完
	for (auto ch : s2)//使用范围for进行打印
	{
		cout << ch;
	}
	return 0;
}

        那么代码一走,我们的程序结果如下:

六,string类非成员函数

 1,operator<<和operator>>

        想要打印或者输入string类中的字符串内容?很简单,C++已经帮我们字符串重载好了。当我们想要对某个string类的对象进行内容的输入和输出时,那么我们就可以直接使用<<>>,示例如下:

int main()
{
	string s1;
	cin >> s1;
	cout << s1;
	return 0;
}

        那么代码一走,我们输入"hello",结果如下:

2,getline

        我们现在学习一个getline函数,它比operator>>更加的强大,getline函数只会在遇到换行时才会停止,并不会像operator>>一样遇到空格就停止,而它的使用示例如下:

int main()
{
	string s1;
	getline(cin, s1);//输入hello world
	cout << s1 << endl;
	return 0;
}

         若我们想要getline函数在遇到特定的字符停下,我们则可以如下使用:

int main()
{
	string s1;
	getline(cin, s1,'*');//输入hello w*orld,使getline在遇到*时停下
	cout << s1 << endl;
	return 0;
}

七,结语

        这是string类的基本介绍,看完了这些,那么相信你对string类也有了初步了解,能够正常的使用这个类了,接下来我会更新vector类的讲解,这个类也是一个C++中不可或缺的知识点,学习了它,那你写代码就会直接飞起来,尽情期待吧!

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

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

相关文章

zoom 会议 javascript 转录例子

一、启动server-to-server zoom api服务&#xff0c;用于创建会议&#xff0c;参考&#xff1a;如何使用Zoom API创建一个会议&#xff1f;-CSDN博客 二、启动meetingsdk-auth-endpoint服务&#xff0c;用于加入会议&#xff0c;参考&#xff1a;zoom 会议机器人web例子-CSDN博…

前端问答:如何在HTML中插入度数符号?

在前端开发中&#xff0c;你可能经常需要在网页中显示温度、角度或地理坐标&#xff0c;这时就需要用到度数符号&#xff08;&#xff09;。那么&#xff0c;如何在HTML中正确地插入这个符号呢&#xff1f;今天&#xff0c;我来手把手教你三种简单又实用的方法&#xff0c;让你…

怎么压缩图片大小?7款实用图片压缩免费软件大公开,赶紧收藏试试!

电脑怎么压缩图片大小&#xff1f;您是否也正在寻找一种方法&#xff0c;可以在不损失质量的情况下压缩图片&#xff1f;在我们的日常生活中&#xff0c;图片记录着无数美好瞬间&#xff0c;已经成为我们日常生活中不可或缺的一部分&#xff0c;无论是个人使用还是专业需求。随…

解决TESSY导入测试用例后出现提示接口有改变的问题

Tessy支持测试用例的导入&#xff0c;不懂测试用例怎么导入&#xff0c;可以看这一篇文章&#xff1a; TESSY导入导出测试用例-CSDN博客 当成功的导入测试用例到工程后&#xff0c;在TIE中查看了用例的源码和头文件路径都没有问题后&#xff0c;就可以执行分析&#xff1a; 但是…

分享一个基于Python的广东热门旅游数据可视化分析系统flask毕设(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

ESP Friends 技术沙龙报名开启|带您掌握高效 GUI 开发

乐鑫 ESP32 系列 SoC 凭借其功能多样、高性价比、封装友好、资源丰富等优势&#xff0c;已成为全球开发者在需要屏幕显示的泛 IoT 应用里作为项目开发的首选平台。 乐鑫信息科技 (688018.SH) 即将举办 ESP Friends 线下技术沙龙。我们将带您深入探索 ESP32-C2 在小尺寸 LCD (0…

【源码】IMX6uLL与QT的串口通信

文章目录 [TOC](文章目录) 前言1、QT编写串口2、编译3、加载触摸屏驱动4、硬件接线5、运行可执行程序6、结果 前言 仓库&#xff1a;https://gitee.com/wangyoujie11/im6u-ll-qt-seriral 1、QT编写串口 2、编译 编译将生成的可执行文件&#xff1a;QtSerial放在板子上【这里…

计算机辅助编码

计算机辅助编码&#xff08;Computer Assisted Coding, CAC&#xff09; 背景 在医疗行业中 Coding 是一个细分行业&#xff0c;从业人员在国外有专门的 培训 开始 资格认证。在国内也有医疗编码员考试。主要工作就是根据病人的信息、病案 给出医疗编码&#xff08;ICD、CPT&…

React学习day03-components插件安装(仅基于火狐浏览器)、受控表单绑定、在React中获取dom、组件通信(组件间的数据传递)

7、components插件安装&#xff08;仅基于火狐浏览器&#xff09; &#xff08;1&#xff09;点击“打开应用程序菜单” &#xff08;2&#xff09;点击“扩展和主题” &#xff08;3&#xff09;在“扩展”的“寻找更多组件”搜索“Components”&#xff0c;找到“React Deve…

Leetcode 46. 全排列 排列型回溯 C++实现

Leetcode 46. 全排列 问题&#xff1a;给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以按任意顺序返回答案。 算法&#xff1a; 创建二维返回数组 ans &#xff0c;和临时数组 path &#xff0c;on_path 。 进入 dfs 函数&#xff0c;当 in …

xshell 终端选中文本后自动执行ctrl+c

1. 退出钉钉后&#xff0c;解决问题&#xff0c; xshell终端可以正常使用了。 2. 修改钉钉设置来解决问题&#xff1a; 设置-> 通用-> AI助理 &#xff0c; 取消指定选项。

89.游戏安全项目-htdSdk安装

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;88.游戏改造-UI修正保存到可执行文件 文件名为&#xff1a;黑兔sdk.zip 链接&#xff1…

Linux下UDP编程

一.概念介绍 1.socket 是什么&#xff1f; socket&#xff08;套接字&#xff09;本质上是一个抽象的概念&#xff0c;它是一组用于网络通信的 API&#xff0c;提供了一种统一的接口&#xff0c;使得应用程序可以通过网络进行通信。在不同的操作系统中&#xff0c;socket 的实…

Cobalt Strike 4.8 用户指南-第四节-监听器和基础设施管理

4.1、概述 任何行动的第一步都是建立基础设施。在 Cobalt Strike 中&#xff0c;基础设施由一台或多台团队服务器、重定向器以及指向团队服务器和重定向器的 DNS 记录组成。一旦团队服务器启动并运行&#xff0c;你将需要连接到它&#xff0c;并将其配置为接收来自受感染系统的…

呼叫中心系统数据分析报表统计

呼叫中心系统在客服职场中具有非常重要的作用&#xff0c;可以说如果呼叫中心系统瘫痪整个客服职场都无法工作。呼叫中心的数据统计分析功能对于企业来说也是非常重要的&#xff0c;能够快速帮助企业生成各种数据报表。 呼叫中心系统数据分析统计功能包括&#xff1a;工作量统计…

解锁AI力量:Gemini模型在Android中的技术应用

说在前面的话 大型语言模型&#xff08;LLM&#xff09;是近年来人工智能领域最令人瞩目的突破之一。它们拥有强大的语言理解和生成能力&#xff0c;能够完成各种任务&#xff0c;为我们打开了一个全新的世界。 以下是一些常见的使用场景&#xff1a; 1. 内容创作&#xff1…

如何为你的jar包上保险,防止别人反编译获取代码。Jar混淆全网最详细教学

写在前面:众所周知,Java程序不管使用maven或者Gradle进行构建,都可以获得一个可运行的jar包,比如现在我写了一个IDEA插件可以实现在IDEA中输入中文的名称之后自动变成是规范的英文类,那么在进行友好的分享时候,如何防止自己的jar依赖被别人翻版,就是本次给大家提供的教学…

Android 12系统源码_输入系统(二)InputManagerService服务

前言 上一篇我们简单介绍了Android系统输入事件的常见类型和事件的传递流程&#xff0c;输入事件的传递流程主要分三个部分&#xff0c;输入系统处理部分、WMS处理部分、View处理部分。 其中输入系统处理部分细分为输入子系统处理部分和InputManagerService处理部分&#xff…

嵌入式学习----IO多路复用

1.概念&#xff1a;多个IO复用一个进程 2.IO多路复用的一般实现&#xff1a; &#xff08;1&#xff09;创建文件描述符集合 &#xff08;2&#xff09;添加文件描述符到集合中 &#xff08;3&#xff09;通知内核开始监测 &#xff08;4&#xff09;根据返回的结果做对应…

TESSY创建单元测试或集成测试工程

我们以tessy5.1 IDE为例&#xff0c;给大家展示工程的创建过程。 1、打开TESSY5.1软件后&#xff0c;会弹出&#xff1a; 2、点击NEW Project后&#xff0c;会弹出&#xff1a; 3、接下来&#xff0c;就可以打开刚创建的工程&#xff1a; 4、进入到TESSY的主界面后&#xff0c…