C++之string类的使用

news2024/11/19 16:47:29

C++之string类的使用

  • 1.为什么要学string类
  • 2.标准库中的string类
  • 3.string类的接口的使用
    • 3.1默认成员函数
    • 3.2容量操作
    • 3.3访问操作
    • 3.4遍历操作
    • 3.5修改操作
    • 3.6字符串操作
    • 3.7非成员函数

1.为什么要学string类

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

因此C++标准库提供了字符串类模板,为我们提供了各种功能的接口,而不在关心底层是如何实现的,方便我们去使用。

在学习一个模板的时候,我们需要了解这个模板提供了哪些接口,接口实现了什么功能,返回值等等,这里提供C++标准库,里面有各种模板的详细介绍。

2.标准库中的string类

在这里插入图片描述
basic_string是一个标准库提供的字符串类模板,charT是模板参数,表示的是字符类型,字符串由这种类型的一系列字符组成。后面的参数暂时不用管,后面再说。

在这里插入图片描述
这个类模板可以实例化上面4种类。

可能会有这样的疑问,字符串里面包含的都是普通字符,为什么要实例化4种类呢?

其原因是因为字符编码的问题。

补充知识

1.我们在C语言所接触最多的是ASCLL,包含了大小写字母,数字,标点符号等等…这套编码是由美国发明的,是符合老美文字习惯。但是为了将计算机推展到全世界,还需要包括其他国家文字。因此有了统一码(unicode)也叫万国码。

2.unicode有UTF-8、UTF-16、UTF-32三种将数字转换到程序数据的编码方案。一个字大小分别占1个字节,2个字节,4个字节。

3.我们使用最多是UTF-8,这种编码方案兼容ASCLL,还省空间。

在这里插入图片描述

以后根据字符编码不同,可以选择对应的实例化的类。

简单认识string类的构成

template<class T>
class basic_string
{
public:
	//各种成员函数
private:
	T* _str;
	size_t _size;
	size_t _capacity
};

typedef basic_string<char> string;

int main()
{
	//这两种是等价的
	basic_string<char> s;
	string s;
}

字符串类其实本质就是动态增长的数组,学过数据结构的数组,这里更容易理解。

使用string必须包含头文件

#include<string>

3.string类的接口的使用

string类每一种接口都有很多函数重载,下面主要讲述的是一些常用的需要重点掌握的,不需要看文档就会用的,其他没有讲述的如果需要用,在查文档。

3.1默认成员函数

在这里插入图片描述
默认成员函数包括:构造函数(包含拷贝构造函数),析构函数,赋值运算符重载函数

构造函数

在这里插入图片描述
拷贝构造函数是构造函数的重载,因此构造函数包含里包含拷贝构造函数。

在这里插入图片描述

(constructor)函数名称功能说明
string() (重点)构造空的string类对象,即空字符串
string(const char* s) (重点)用C-string来构造string类对象
string(size_t n, char c)string类对象中包含n个字符c
string(const string&s) (重点)拷贝构造函数

在这里插入图片描述

赋值运算符重载函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2容量操作

在这里插入图片描述

函数名称功能说明
size(重点)返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回空间总大小
empty (重点)检测字符串释放为空串,是返回true,否则返回false
clear (重点)清空有效字符
reserve (重点)为字符串预留空间
resize (重点)将有效字符的个数该成n个,多出的空间用字符c填充

在这里插入图片描述

size和length都返回字符串有效字符长度,不包括’\0’。

这里可能会有疑问,一样功能的实现两个函数?

1.最开始求字符串有效字符长度只有length,但是有了STL(标准模板库)之后,涉及的模板多了起来,如求二叉树结点个数,链表长度,就不是能用length能表达清楚的了,所以有了size。
2.string为了符合STL(标准模板库),也有了size,在后面我们经常使用的是size。

在这里插入图片描述

当string类存放字符空间是动态开辟的,空间不够会扩容。

	//插入1000个字符,看是否扩容
	string s;
	size_t capacity = s.capacity();
	cout << "capacity:" << capacity << endl;
	for (int i = 0; i < 1000; ++i)
	{
		s.push_back('x');
		if (capacity != s.capacity())
		{
			capacity = s.capacity();
			cout << "change capacith:" << capacity << endl;
		}
	}

在这里插入图片描述
不同编译器扩容是不一样的。下面看看在Linux情况下,同一段代码扩容情况。

在这里插入图片描述
在这里插入图片描述
可以看见在Liunx下,同样代码,每次申请空间都是2倍。

我们知道频繁扩容是有代价的。如果我们预先知道开辟多大空间,就可以减少扩容,提高效率。

reserve为字符串预留空间。

在这里插入图片描述

empty判断字符串是为空。

在这里插入图片描述
clear清楚有效字符,清除之后是否缩容,看string类是如何规定。

在这里插入图片描述

resize,将有效字符的个数改成n个,多出的空间用字符c填充
resize有三种情况:
1.n<size
在这里插入图片描述

删除数据

2.size<n<=capacity
在这里插入图片描述

插入数据,如果没有指定用’\0’填充。

3.n>capacity
在这里插入图片描述

扩容+插入数据

3.3访问操作

在这里插入图片描述

函数名称功能说明
operator[] (重点)返回pos位置的字符,const string类对象调用

在这里插入图片描述

operator[]是常用的访问操作,不仅可以访问,还可以修改。

在这里插入图片描述

3.4遍历操作

void test_string4()
{
	string s("hello world");
	//遍历
	//1.普通遍历
	for (size_t i = 0; i < s.size(); ++i)
	{
		//字符+1
		s[i] += 1;
		cout << s[i] << " ";
	}
	cout << endl;

	//2.范围for遍历
	for (auto& ch : s)
	{
		//字符-1
		ch -= 1;
		cout << ch << " ";
	}
	cout << endl;

	//3.迭代器iterator
}

在这里插入图片描述

迭代器:是一种通用的访问方式。

iterators行为上像指针一样的类型
注意不同迭代器是不一样的。

	//3.迭代器iterator
	//正向迭代
	string::iterator it1 = s.begin();
	while (it1 != s.end())
	{
		*it1 += 1;
		++it1;
	}
	it1 = s.begin();
	while (it1 != s.end())
	{
		cout << *it1 << " ";
		++it1;
	}
	cout << endl;

在这里插入图片描述
返回字符串第一个数据位置

在这里插入图片描述
返回字符串最后一个有效数据的下一个位置。

	//反向迭代
	string::reverse_iterator it2 = s.rbegin();
	while (it2 != s.rend())
	{
		cout << *it2 << " ";
		++it2;
	}
	cout << endl;

在这里插入图片描述

在这里插入图片描述

rebegin返回有效字符最后一个位置

在这里插入图片描述

rend返回有效字符第一个位置

	//const正向迭代
	//只能遍历,不支持修改
	string::const_iterator it3 = s.begin();
	while (it3 != s.end())
	{
		cout << *it3 << " ";
		++it3;
	}
	cout << endl;

	//const反向迭代
	//只能遍历,不支持修改
	//string::const_reverse_iterator it4 = s.rbegin();
	//auto 根据右边推测左边的类型
	auto it4 = s.rbegin();
	while (it4 != s.rend())
	{
		cout << *it4 << " ";
		++it4;
	}
	cout << endl;

我们看见有的接口实现了两种类型,一个加const,一个没加const。
如果我们自己实现一个类也需要考虑要不要加上实现加const版本的函数。
在这里插入图片描述
总结:

1.只读功能函数,只提供const版本即可
2.只写功能函数,只提供非const版本即可
3.读写功能函数,需提供const+非const版本

3.5修改操作

在这里插入图片描述

函数名称功能说明
push_back在字符串后尾插字符c
append在字符串后追加一个字符串
operator+= (重点)在字符串后追加字符串str
insert插入字符串
erase删除字符串中的字符
assign为字符串指定一个新值,替换其当前内容。
swap交换字符串值

push_back
在这里插入图片描述

append 和构造函数的重载函数一样,但是常用的是第一个和第三个

在这里插入图片描述
在这里插入图片描述

operator+=是我们需要重点掌握的

在这里插入图片描述
在这里插入图片描述

insert 插入字符串
插入意味着挪动数据,所以string很少使用

在这里插入图片描述
在这里插入图片描述
剩下的可以自行了解文档。

erase删除字符串中的字符
也是要挪动属性,很少使用。

在这里插入图片描述

默认开始位置是0,默认长度是npos

在这里插入图片描述

size_t是无符号整型 ,-1会整型提升无符号整型,因此-1就变成了4294967295。

在这里插入图片描述

assign和replace都是替代原有的字符串,但是assign是清理掉原数组之后在赋值,而replace不清理原数组,直接替代。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

swap交换字符串的值
在这里插入图片描述

在这里插入图片描述

3.6字符串操作

在这里插入图片描述

函数名称功能说明
c_str(重点)返回C格式字符串
find + npos(重点)从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回

c_str返回c格式字符串。

在这里插入图片描述

注意返回值是 const类型。

在这里插入图片描述

find,正向在字符串中查找内容

在这里插入图片描述
找到返回第一个匹配的第一个字符的位置。找不到返回string::npos

在这里插入图片描述

rfind,反向在字符串中查找内容。

在这里插入图片描述

在这里插入图片描述

**find_first_of,查找字符串中的字符,该函数和find不一样,这个函数会搜索参数中指定的任何字符匹配的第一个字符。。当指定位置时,搜索仅包括位置位置处或位置之后的字符,忽略位置之前可能出现的任何字符。**当作了解即可,用的很少。

在这里插入图片描述

搜索成功返回匹配字符的位置,不成功返回npos

在这里插入图片描述
在这里插入图片描述

substr生成子字符串
返回一个新构造的字符串对象

在这里插入图片描述
在这里插入图片描述

3.7非成员函数

在这里插入图片描述

函数名称功能说明
operator+尽量少用,因为传值返回,导致深拷贝效率低
operator>> (重点)输入运算符重载
operator<< (重点)输出运算符重载
getline (重点)获取一行字符串
relational operators (重点)大小比较

operator>>从流中提取字符串

在这里插入图片描述
operator<<将字符串插入流
在这里插入图片描述

在这里插入图片描述
为什么输的是hello world,结果只打印处理hello呢?

cin和scanf都是输入,cin标准化输入,scanf格式化输入。
cin取数据时会忽略空格和回车继续输入。
scanf取数据时遇到回车、空格就会停止。
为了使cin和scanf一样,库里面实现的operator<<就针对做了特殊处理。

如果就想拿到整个字符串,使用getline函数将行从流转换为字符串
在这里插入图片描述

在这里插入图片描述

relational operators是字符串大小比较的接口
在这里插入图片描述
在这里插入图片描述

string类接口还有很多,这里只是例举了一些比较重要的,都标上了重点。需要不看文档就知道怎么。剩下的内容大家在下面在多多练习。好了本篇string类的使用到这里就结束喽。
下篇string类的模拟实现.

喜欢的小伙伴,点赞,评论,加收藏!感谢支持!

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

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

相关文章

html | 基于iframe的简易富文本编辑器

效果图 支持: 选中后 ctrlI 斜体 代码 思路就是在iframe种嵌套html和css。 <pre> - 支持: 选中后 ctrlI 斜体 - todo: 鼠标实现单击斜体 </pre> <iframe name"richedit" style"height:30%; width:100%;"></iframe><script…

层叠上下文、层叠顺序

什么是层叠上下文 层叠上下文&#xff08;Stacking Context&#xff09;是指在 HTML 和 CSS 中&#xff0c;用于控制和管理元素层叠顺序以及呈现的一种机制。在一个网页中&#xff0c;许多元素&#xff08;例如文本、图像、背景等&#xff09;可能会重叠在一起&#xff0c;这时…

Hvv之Nacos漏洞分析与整改

目录 什么是nacos 漏洞复现过程 解压、修改配置文件、启动、 复现任意创建账户漏洞 问题分析 修改建议 什么是nacos Nacos 是阿里巴巴推出来的一个新开源项目&#xff0c;这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 NACOS界面提示“内部系统…

冠达管理:市盈率除以市净率是什么意思?

市盈率&#xff08;Price-to-Earnings Ratio&#xff0c;简称P/E&#xff09;和市净率&#xff08;Price-to-Book Ratio&#xff0c;简称P/B&#xff09;是股票商场中常用的两个评价目标。市盈率衡量的是一家公司的市值与其盈余才能的联系&#xff0c;而市净率则是衡量其市值与…

Ladp数据库安装和配置自定义schema ,Centos7环境

最近安装ldap看了不少教程&#xff0c;整理下用到的有用的资料&#xff0c;并把自己的搭建过程分享。 参考 ldap介绍&#xff1a;openLDAP入门与安装 官方文档&#xff1a;https://www.openldap.org/doc/admin22/schema.html 安装配置&#xff1a;Centos7 搭建openldap完整详…

C++之模板进阶

模板进阶 非类型模板参数模板的特化概念函数模板特化类模板特化全特化偏特化 模板分离编译什么是分离编译模板的分离编译解决方法 模板总结 非类型模板参数 模板参数分两种&#xff1a;类型形参与非类型形参。 类型形参&#xff1a;出现在模板参数列表中&#xff0c;跟在class…

LeetCode--HOT100题(35)

目录 题目描述&#xff1a;23. 合并 K 个升序链表&#xff08;困难&#xff09;题目接口解题思路1代码解题思路2代码 PS: 题目描述&#xff1a;23. 合并 K 个升序链表&#xff08;困难&#xff09; 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合…

STM32单片机蓝牙-APP全自动洗衣机水位检测洗涤脱水排水

实践制作DIY- GC0164--蓝牙-APP全自动洗衣机水位检测 基于STM32单片机设计---蓝牙-APP全自动洗衣机水位检测 二、功能介绍&#xff1a; 硬件组成&#xff1a;STM32F103C单片机最小系统LCD1602显示器 1个5V直流电机&#xff08;低速洗衣高速脱水&#xff09;1个加水电磁阀1个排水…

Windows下打包工具包为一个exe

1. 目的 很多时候&#xff0c;一个工具包有除了一个exe还有不少配置文件及dll库。如果只想给客户发布一个exe&#xff0c;要怎么办呢&#xff1f;使用静态编译&#xff0c;不使用dll&#xff0c;将资源编译到exe中&#xff0c;使用时再释放出来。这种方法比较麻烦&#xff0c;…

ZK-C3595、ZK-C35100、ZK-C40100、ZK-C40110超越离合器

ZK-A3072、ZK-A3080、ZK-A4090、ZK-A3595、ZK-A35100ZK-A40100、ZK-A40110、ZK-A3072、ZK-C3080、ZK-C4090、ZK-C3595、ZK-C35100、ZK-C40100、ZK-C40110单向离合器(超越离合器) MG300M1300MG400、M1400MG500、M1500MG600、M1600MG700、M1700MG750、M1750MG800、M1800MG900、M1…

NLP的tokenization

GPT3.5的tokenization流程如上图所示&#xff0c;以下是chatGPT对BPE算法的解释&#xff1a; BPE&#xff08;Byte Pair Encoding&#xff09;编码算法是一种基于统计的无监督分词方法&#xff0c;用于将文本分解为子词单元。它的原理如下&#xff1a; 1. 初始化&#xff1a;将…

No accessible constructors were found for the type‘XXXXXX‘

abp框架新建了一个模版项目&#xff0c;启动报错。 //报错实例 Autofac.Core.Activators.Reflection.NoConstructorsFoundException:“No accessible constructors were found for the type weigu.Admin.Order.OrderHuizongAppService.”报错意思是没有为’ weight.admin.orde…

骑行运动耳机哪款好?五年骑行爱好者给你分享分享

作为一名骑行达人&#xff0c;我尝试过多种骑行耳机&#xff0c;有入耳式、耳罩式、骨传导等等&#xff0c;但总有一款让我特别满意。直到我遇到了这几款耳机&#xff0c;它不仅音质出色&#xff0c;而且非常适合骑行&#xff0c;让我爱不释手。下面&#xff0c;我将分享一下这…

渗透测试之逻辑漏洞

文章目录 一、支付漏洞1.修改附属值2.多重替换支付3.重复支付4.最小额支付5.最大值支付6.越权支付7.无限制试用8.多线程并发9.支付漏洞思路 二、密码找回漏洞1.本地验证绕过2.利用session重新绑定客户3.去掉验证参数绕过4.总结 三、短信验证码绕过1.短信验证码生命期限内可暴力…

unity 之 Vector 数据类型

文章目录 Vector 1Vector 2Vector 3Vector 4 Vector 1 在Unity中&#xff0c;Vector1 并不是一个常见的向量类型。 如果您需要表示标量&#xff08;单个值&#xff09;或者只需要一维的数据&#xff0c;通常会直接使用浮点数&#xff08;float&#xff09;或整数&#xff08;in…

安卓手机跑 vins slam (2)

既然选择把vins的代码移植到新工程&#xff0c;那么就需要先确定自己电脑的Android Studio的C开发环节是OK的&#xff0c;可以通过创建C的示例工程&#xff0c;能正常跑通做验证。 选择Native C 需要选择用C哪个版本&#xff0c; 这里通过百度搜索&#xff0c;slam 编译需要C 1…

边缘智能初创公司AiM Future成功完成A轮投资

AiM Future是一家总部在韩国专注于边缘AI加速技术的公司&#xff0c;最近完成了A轮融资。在融资环境不是那么友好的情况下&#xff0c;还能完成融资还是很厉害的&#xff0c;可以来了解一下这个公司最新融资情况。以下为官方新闻稿。 新闻亮点&#xff1a; AiM Future 获得数百…

Richtek(立锜)车载PD快充产品常见问题解答—兼具 USB PD 和 UFCS 快充电源完整解决方案

1 我的Switch游戏机能不能用最新的PD协议&#xff1f; 可以的&#xff0c;PD最新协议都兼容旧协议 2 PD协议向下兼容吗&#xff1f; 是的&#xff0c;PD3.1也是向下兼容的 3 UFCS协议目前用什么仪器测试&#xff1f; 谢谢。 目前RICHTEK有协议测试工具&#xff0c;中国UFCS协…

操作系统的体系结构、内核、虚拟机

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaweb 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 操作系统结构 一、操作系统体系结构1.1操作系统的内核1.1.…

一些常用的CSDN 设置命令、插入目录、改变字体颜色等

文章目录 字体颜色显示调节插入图片大小图片居中 字体颜色显示 字体两边加 调节插入图片大小 注意下边多一个600x600&#xff0c;等号前边有个空格 在这里插入图片描述](https://img-blog.csdnimg.cn/5a0d3d2d37cf481db0e1346432be3da1.png [在这里插入图片描述](https://img-…