【C++】-string的介绍以及使用(迭代器的介绍和使用)

news2024/9/21 18:58:00

💖作者:小树苗渴望变成参天大树
❤️‍🩹作者宣言:认真写好每一篇博客
💨作者gitee:gitee
💞作者专栏:C语言,数据结构初阶,Linux,C++
在这里插入图片描述
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!

文章目录

  • 前言
  • 一、什么是string类
    • 1.1类的基本使用
      • 1.1.1string类构造函数的使用
      • 1.1.2string类的修改操作
      • 1.1.3 string类对象的容量操作
      • 1.1.4string类非成员函数
    • 1.2string类对象的访问及遍历操作
  • 二、总结


前言

今天我们来讲一个新的知识,让你开始进入STL的世界,让我们再也不想回到C语言的世界,今天的住店内容是带你体会string类的用法和常用的函数,下一篇在带大家模拟实现这个类,通过底层让大家更好的理解string类,话不多说,我们开始进入正文


一、什么是string类

在我们C语言阶段,我们怎么定义一个字符串?

char*p="nihao,C++";
char s[]="nihao,C++";

我们可以这样定义字符串,我们想要操作这个字符串要调用想要的函数,函数和这个字符串没有任何关系,这显然不符合类和对象的思想,按照我们oop思想,我们的字符串和对应的操作函数应该归为一类,所以这个时候出现了string类,他是管理字符串的一个类,给我们设计了很多操作方便的函数,让我们更好的操作函数,这也是我们为什么要学习string的一个重要原因,可以更好提高开发效率,

其实string就是一个顺序表来存放字符的,在后面的模拟实现也是和顺序表的定义是一样的,这恶鬼大家先理解一下。

接下来我带大家来看文档·,初步带大家了解string类,打开搜索string,就出现下面的界面
在这里插入图片描述
我们来看看他实现的函数其实有100多个
在这里插入图片描述
这样函数里面,我们不需要都记得,我会把常用给大家一一介绍展示一下,我们一个个的来看。

1.1类的基本使用

我们先来看看构造函数,string一共是实现7个构造函数,今天就简单的讲解几个:

1.1.1string类构造函数的使用

在这里插入图片描述

    string s1;
	string s2("hello world");
	string s3(s2);
	string s4("nihao,string", 5);
	string s5(5, '@');
	string s6(s2,5,10);

在这里插入图片描述
对于最后一个构造函数我们发现他多了一个缺省参数,我们来看看文档,他具体是什么
在这里插入图片描述

我的理解就是,如果你没有给截取子串的右区间,那么就默认一直截取到字符串的结尾,怎么保证每个字符串都可以截取到结尾,只能使用一个特别大的数来,截取到结尾也就停止了。
在这里插入图片描述
我们看到结果是-1,这里巧用了无符号整型这个关键字,-1其实是整型的最大值,这样就解决我们刚才说的那个问题,大家下来可以自己去测试一下他的效果

1.1.2string类的修改操作

我们来看文档介绍:
在这里插入图片描述
在这里插入图片描述
大家可以具体看看每个函数的功能,有的函数可能实现了运算符重载,有不同的功能,大家可以查文档看看。

对于+=运算符其实可以更好的替代push_back和append。

1.1.3 string类对象的容量操作

我们再来看文档:
在这里插入图片描述
size和length:
在这里插入图片描述

这两个其实是一模一样的效果,其实length是最先出来的,计算字符串长度是一个顺序表的结构,但是后面为了对接其他的结构,比如树,图等一些非线性结构的大小,使用size更好的表示大小,所以后面我们也是使用size多一些

capacity:
在文章开头,我提到过string是通过顺序表的结构来存放字符的,并不是你字符串多大,他开的空间就是多大,是根据不同的平台而定的

在vs下:
在这里插入图片描述
在Linux下:
在这里插入图片描述
我们上面写过追加字符串,我们有了容量的概念,肯定要进行扩容,我们来看看扩容机制是什么

在vs上:
在这里插入图片描述
在Linux上:
在这里插入图片描述

在不同的平台的扩容机制是不一样的。

reserve:
这个是为字符串预留n个空间,我们发现在上面循环100次就扩容了三次,扩容肯定会带来效率的降低,所以在我们大约知道字符串有多长的情况下,为他预先留出足够容量的空间。

在这里插入图片描述

他可以理解为扩容,在原字符串大小的基础下预留n个空间大小,并不会改变自身的大小,有效字符个数还是原来的个数,这个可以提高效率,减少扩容带来的消耗

在这里插入图片描述

我们看到当reverse的参数小于字符串本身的大小或者小于容量大小,并不会影响总大小和减少容量的,所以在底层的时候,这种情况直接返回,不做任何处理了。

resize:
是改变字符串的大小的,改变有效字符个数的,就传一个参数,用\0来填充,不然用字符来填充。
在这里插入图片描述
大家可以看到这是可以改变原字符串大小的,大于容量则会自动扩容,但参数小于本身大小会发生什么呢??
在这里插入图片描述

有效字符个数也变少了,但是容量不会改变,这个要和上面的reserve区分开,他两有很大的差距,可以简单理解为,一个在capacity上做事情,一个在size上做事情

clear:
这个函数是将有小字符个数清空,但并不会将容量改变,底层空间还是没有改变的
在这里插入图片描述

不能理解为把空间都清除了

empty:
字符串是否为空串
在这里插入图片描述

通过这个可以看出来我们的判断是否为空是根据有效字符个数,也就是size。

总结:

  1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。

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

  3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。

  4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。

1.1.4string类非成员函数

我们之前再介绍了流插入和流提取的运算符,明白了为什么这个不能作为成员函数,因为不想使用隐藏的this指针,有的函数不止给string类去使用,比如swap,所以也不能写成内部函数,有的是创造者觉得放到外部会显得舒心些,接下来就简单介绍几个吧

operator>>和operator<<:
这两个流插入和流提取运算符重载大家应该有所了解,内部应该使用了友元函数,这样才能访问内部的私有成员,这个的实现其实和日期类的实现几乎差不多,等到底层的模拟实现再具体介绍吧,我们就来看他怎么使用的吧。

在这里插入图片描述
operator+:
在这里插入图片描述
这个函数为什么设计成外部函数呢??原因就是创造者想要的不止是两个字符串相加,也想实现字符之间的相加,如果写在内部,就必然会有this指针,是string类型的,所以创造者将他写在类外,方便更好的重载

在这里插入图片描述
可以理解为是字符串的拼接,我们尽量少用这种方式去操作,因为他是传值返回,有拷贝的消耗,希望大家可以理解

swap:
在这里插入图片描述

两个字符串的交换。
在这里插入图片描述

getline:
在这里插入图片描述
对于这个函数,因为我们目前值知道两个流,所以我将以输入的方式展示给大家,这是获取一行字符串

int main()
{
	string name;

	cout << "Please, enter your full name: ";
	while (getline(cin, name))
	{
		cout << "Hello, " << name << "!\n";
	}
	return 0;
}

在这里插入图片描述

这个大家先了解一下,以后遇到再介绍,对于非成员函数大家应该知道了

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

接下来讲讲字符串的遍历,既然字符串地城是类似于顺序表的结构,那么应该可以通过下标来遍历每个字符,我们有三种方式进行操作,对于字符串我们常用的第一种

第一种:按照for循环遍历字符串
在这里插入图片描述
类中实现了[]这个操作符,所以我们可以通过下标来访问每个字符,都是用字符引用返回,我们来看看怎么使用的:
在这里插入图片描述
我们的[]这个操作符就实现这两种重载,大家看看有啥区别

第二种:迭代器
这是一个非常重要的知识点,这个可以说是一个通用的遍历,只要是容器结构的都可以,一会通过两个例子给大家介绍一下,我们先来看看怎么遍历string:

int main()
{
	string s1("hello world");
	string::iterator sit = s1.begin();
	while (sit != s1.end())
	{
		cout << (*sit) << " ";
		sit++;
	}
	return 0;
}

在这里插入图片描述
可以把迭代器简单当成就是指针,**s1.begin()**得到字符串数组的首地址,s1.end()得到字符串数组的末地址,通过变量sit变量,类似于指针的操作,再string中体会不到他的优势,我们再其他两个结构里面看看,这个知识大家可能不了解,大家看看再说:
在这里插入图片描述

我们的链表和容器也都可以使用这种办法,我们的迭代器不止这些,上面只适合非const的正向遍历,还有其他三种方式,我们一起来看看

string s1("hello world");
	cout << "非const的正向遍历:";
	string::iterator sit = s1.begin();
	while (sit != s1.end())
	{
		cout << (*sit) << " ";
		sit++;
	}

	cout << "\n非const的反向遍历:";
	string::reverse_iterator sit1 = s1.rbegin();
	while (sit1 != s1.rend())
	{
		cout << (*sit1) << " ";
		sit1++;
	}

	cout << "\nconst的正向遍历:";
	const string s2(s1);
	string::const_iterator sit2 = s2.cbegin();
	while (sit2 != s2.cend())
	{
		cout << (*sit2) << " ";
		sit2++;
	}
	

	cout << "\nconst的反向遍历:";
	string::const_reverse_iterator sit3 = s2.crbegin();
	while (sit3 != s2.crend())
	{
		cout << (*sit3) << " ";
		sit3++;
	}

在这里插入图片描述
这是再来看一下文档:
在这里插入图片描述

这个刚好四组:大家可以自己来记忆一下,这个后面用的特别多。
所以这是一种统一访问和修改数据的方法。

第三种:范围for

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

在这里插入图片描述
就是把s1的数据赋值给s然后再访问数据,也可以修改数据。

这三种方法相信大家应该都知道了吧,对于string类我们更偏向第一种,对于迭代器后面遇到再好好讲,反正大家一定监视过了,并且会使用一点了,对于范围for不是反向遍历,也是缺点之一。

二、总结

对于string的使用我就先讲到这里,前前后后应该讲了二十几个常用的函数,其余的我们可以查文档去使用就可以了,这个不是很难,大家要会使用才是关键,接下来的一篇我讲模拟实现一个string类,这样大家可以更好的理解string类。我们下篇再见

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

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

相关文章

谈谈国产化CRM系统市场前景与发展趋势

随着数字化时代的到来&#xff0c;CRM系统已经成为企业管理中不可或缺的一部分。在过去&#xff0c;大多数企业都选择使用海外CRM系统&#xff0c;比如Salesforce、SAP等&#xff0c;但随着国内CRM系统的逐渐发展&#xff0c;越来越多的企业开始将目光转向了国产CRM系统。 一、…

Qt--自定义控件

写在前面 Qt中提供了应用在各种场景的控件&#xff0c;使开发人员在实际工作中选择。但有些特定的场合中这些控件并不满足需要时&#xff0c;Qt允许使用自定义的控件。 例&#xff1a;我们在工作中有这样一种需求&#xff0c;点击按钮会根据一些其他状态来显示不同的图片&…

在外远程登录局域网下的象过河ERP管理系统,无需公网IP

文章目录 概述1.查看象过河服务端端口2.内网穿透3. 异地公网连接4. 固定公网地址4.1 保留一个固定TCP地址4.2 配置固定TCP地址 5. 使用固定地址连接 转发自CSDN远程穿透的文章&#xff1a;公网远程访问公司内网象过河ERP系统「内网穿透」 概述 ERP系统对于企业来说重要性不言而…

3D可视化智慧档案馆一体建设平台设计的主要依据

1、《中华人民共和国档案法》 2、《中华人民共和国档案实施办法》 3、GB/T 9386-1988《计算机软件测试文件编制规范》 4、GB/T 15532-1995《计算机软件单元测试规范》 5、GB/T 30961-2014 嵌入式软件质量度量 6、GB2421-89 电工电子产品基本环境试验规程 7、GB16796-2009…

【1377. T 秒后青蛙的位置】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一棵由 n 个顶点组成的无向树&#xff0c;顶点编号从 1 到 n。青蛙从 顶点 1 开始起跳。规则如下&#xff1a; 在一秒内&#xff0c;青蛙从它所在的当前顶点跳到另一个 未访问 过的顶点&#xf…

网终安全技术(刘化君)课后被略的答案

目录 8.HTTP客户机与Wb服务器通信通常会泄露哪些信息&#xff1f; 9.在TCP连接建立的3次握手阶段&#xff0c;攻击者为什么可以成功实施SYN Flood攻击&#xff1f;在实际中&#xff0c;如何防范此类攻击&#xff1f; 常用的网络漏洞扫描技术有哪几种&#xff1f;试举例说明。…

Visual Studio 2010环境新建C工程项目

新建C工程项目 文章目录 新建C工程项目前言1、新建空项目2、编写程序2.1 Hello World2.1 执行.exe文件 3、总结 前言 学习C语言使用的编译器比较多&#xff0c;常见的有VC6.0、Dev-C、Visual Studio、CodeBlocks等环境软件。 Visual Studio和CodeBlocks的功能就稍微强大很多&a…

MySQL_5 有丶牛逼的查询语句

目录 一、分组查询 1.基本语法 : 2.代码演示 : 二、分页查询 1.基本语法 : 2.代码演示 : 三、多表查询 1.定义 : 2.语法 : 3.演示 : 四、嵌套查询 1.定义 : 2.单行子查询 : 1 特点 2 演示 3.多行子查询 : 1 特点 2 演示 4.临时表 : 1 定义 2 演示 5.多列子查询 …

Emacs之实时渲染markdown(九十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Web安全常见攻击

前言 本篇主要简单介绍在 Web 领域几种常见的攻击手段。 1. Cross Site Script&#xff08;XSS跨站脚本攻击) 首先插播一句&#xff0c;为毛叫 XSS&#xff0c;缩写明显是 CSS 啊&#xff1f;没错&#xff0c;为了防止与我们熟悉的 CSS&#xff08;Cascading Style Sheets&am…

类ChatGPT的各种语言大模型LLM开源Github模型集合​

作为开发人员&#xff0c;面对堪称科技奇点爆发的ChatGPT&#xff0c;我们如何应对。当然是努力跟进&#xff0c;虽然ChatGPT不开源&#xff0c;但是有诸多不输ChatGPT的各类语言大模型LLM有分享。我们筛选出其中影响力较大的各个开源Github仓库&#xff0c;收录到 类ChatGPT的…

由浅入深Dubbo网络通信协议大全

目录 1 网络通信协议1.1 dubbo协议1.2 rmi协议1.3 hessian协议1.4 http协议1.5 webservice协议1.6 thrift协议1.7 rest协议1.8 grpc协议1.9 memcached协议1.10 redis协议 2 序列化实现剖析 1 网络通信协议 在之前的内容中&#xff0c;我们讲解了消费者端服务发现与提供者端服务…

局部最小值问题

局部最小值问题 自写&#xff1a; // arr 相邻的数不相等&#xff01; 返回一个局部最小的下标public static int oneMinIndex(int[] arr) {if(arr null || arr.length 0) {return -1;}if(arr.length 1) {return 0;}int L 0;int R arr.length - 1;if(arr[L] < arr[L 1…

C++判断大端小端

C判断大端小端 1. 基础知识 大端小端其实表示的是数据在存储器中的存放顺序。 大端模式&#xff1a;数据的高字节存放在内存的低地址中&#xff0c;而低字节则存放在高地址中。地址由小到大增加&#xff0c;数据则从高位向低位存放&#xff0c;这种存放方式符合人类的正常思维…

Hadoop/HbBase/Hive/HDFS/MapReduce都是什么?

目录 一图胜万言&#xff01;&#xff01; 解释说明 1. hadoop 2. hive 3. hbase 总结 一图胜万言&#xff01;&#xff01; 解释说明 1. hadoop 它是一个分布式计算分布式文件系统&#xff0c;前者其实就是 MapReduce&#xff0c;后者是 HDFS 。后者可以独立运行&…

特瑞仕|关于无线射频

无线射频&#xff08;Radio Frequency, RF&#xff09;是指在一定频率范围内&#xff0c;通过无线电波进行通信和传输信息的技术。随着移动通信、物联网、智能家居等领域的不断发展&#xff0c;无线射频技术已经成为现代社会中不可或缺的一部分。本文将从以下几个方面对无线射频…

打印机无法扫描的原因及解决方法

在家庭和办公环境中&#xff0c;打印机已成为不可或缺的设备。它不仅可以打印文件&#xff0c;还可以扫描文档并将它们转换为数字数据。但有时&#xff0c;打印机可能无法扫描文档或图片。以下是可能导致这些问题的原因和解决方法。 出现打印机无法扫描的原因&#xff1a; 1.…

web基础和http协议

文章目录 一、web基础1.1dns的概念1.2网页的概念1.3HTML的概念1.4静态网页1.5动态网络 二、HTTP协议2.1什么是HTTP协议2.2HTTP的版本协议2.3HTTP的请求方法2.4HTTP的状态码2.5HTTP 请求流程分析 一、web基础 1.1dns的概念 dns用作域名解析&#xff0c;有正向解析和反向解析两…

protobuf全局环境搭建

一、安装npm 1.测试是否安装npm 如果未出现npm 不是内部或外部命令&#xff0c;则先安装npm npm是NodeJs的包管理器&#xff08;Node Package Manager&#xff09; 所以我们要安装npm&#xff0c;其实就是安装NodeJs&#xff0c;进入NodeJs官网 下载完成之后&#xff0c;安装…

7.性能测试

目录 一、常见的性能问题 二、为啥要进行性能测试&#xff1f; 三、确定性能测试的需求&#xff08;性能指标&#xff0c;量化&#xff09; 1.关键性能指标分析 2.关键业务的分析 四、不同维度衡量系统的性能 1.研发人员 2.系统运维人员 3.用户 4.性能测试人员 五、性…