C++之string类的使用

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类的模拟实现.

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工业视觉相机镜头选型方法

一、相机选型 1、首先&#xff0c;根据检测需求确定选用黑白/彩色、面阵/线阵相机&#xff0c;接口类型一般选择GigE 2、确定检测精度要求&#xff08;最小特征尺寸mm&#xff09;、视野范围&#xff0c;一个测量精度对应几个像素数&#xff08;一般取3-5&#xff09; 3、计…

uni-app根据经纬度逆解析详细地址

uni-app中的getLocation()方法可以获取到用户当前的地理位置&#xff08;经纬度&#xff09;、速度。 但是返回参数中的address在app中才会显示&#xff0c;小程序中不会显示&#xff0c;所以我们需要进行逆解析其地址&#xff0c;解析出它的地址信息。 1.首先要在腾讯位置服务…

【Redis从头学-4】Redis中的String数据类型实战应用场景之验证码、浏览量、点赞量、Json格式存储

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Re…

Intelij IDEA 配置Tomcat解决Application Server不显示的问题

今天搭建war工程时部署项目发现&#xff0c;IDEA的控制台没有Application Servers&#xff0c;在网上查了一下&#xff0c;总结几个比较好的解决方法&#xff0c;为了方便自己和其他人以后碰到相同的问题&#xff0c;不再浪费时间再次寻找解决办法。 Intelij IDEA 配置Tomcat时…

如何做好科技文献资料的翻译!

我们知道&#xff0c;科技文献是工程技术人员的重要参考文献&#xff0c;翻译科技文献资料有助于促进国内外科技知识和技术的传播。那么&#xff0c;如何做好科技文献资料的翻译&#xff0c;专业科技文献翻译哪家好&#xff1f; 据了解&#xff0c;科技文献翻译是一种以应用为主…

Nginx虚拟主机(server块)部署Vue项目

需求 配置虚拟主机&#xff0c;实现一个Nginx运行多个服务。 实现 使用Server块。不同的端口号&#xff0c;表示不同的服务&#xff1b;同时在配置中指定&#xff0c;Vue安装包所在的位置。 配置 Vue项目&#xff0c;放在 html/test 目录下。 config中的配置如下&#xf…

接口测试,负载测试,并发测试,压力测试区别

接口测试 1.定义&#xff1a;接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 2.目的&#xf…

Matlab中图例的位置(图例放在图的上方、下方、左方、右方、图外面)等

一、图例默认位置 默认的位置在NorthEast r 10; a 0; b 0; t0:0.1:2.1*pi; xar*cos(t); ybr*sin(t); A1plot(x,y,r,linewidth,4);%圆 hold on axis equal A2plot([0 0],[1 10],b,linewidth,4);%直线 legend([A1,A2],圆形,line)二、通过Location对legend的位置进行改变 变…

无涯教程-Perl - sysread函数

描述 该函数等效于C /操作系统函数read(),因为它绕过了诸如print,read和seek之类的函数所采用的缓冲系统,它仅应与相应的syswrite和sysseek函数一起使用。 它从FILEHANDLE中读取LENGTH个字节,并将输出放入SCALAR中。如果指定了OFFSET,则将数据从OFFSET字节写入SCALAR,从而有效…

小航助学GESP_C++一级模拟测试卷第2套(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSD…

【C++笔记】C++之类与对象(中)

【C笔记】C之类与对象&#xff08;中&#xff09; 1、类的构造函数1.1、构造函数的基本用法1.2、构造函数的7个特性 2、类的析构函数2.1、析构函数的基本用法2.2、析构函数的6个特性 3、类的拷贝构造函数3.1、拷贝构造的基本用法3.2、拷贝构造的“无限套娃”陷阱3.3、深拷贝与浅…

通过css设置filter 属性,使整个页面呈现灰度效果,让整个网页变灰

通过css设置filter 属性设置页面整体置灰 效果图: 通过设置 filter 属性为 grayscale(100%)&#xff0c;页面中的所有元素都会被应用灰色滤镜效果&#xff0c;使整个页面呈现灰度效果。 <style type"text/css"> html { filter: grayscale(100%); -webkit-f…

《Linux从练气到飞升》No.15 Linux 环境变量

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

C++函数模板和类模板

C另一种编程思想称为泛型编程&#xff0c;主要利用的技术是模板 C提供两种模板机制&#xff1a;函数模板和类模板 C提供了模板(template)编程的概念。所谓模板&#xff0c;实际上是建立一个通用函数或类&#xff0c; 其类内部的类型和函数的形参类型不具体指定&#xff0c; 用…

SpringBoot代理访问本地静态资源400 404

SpringBoot代理访问静态资源400 404 背景&#xff1a;pdf文件上传到linux服务器上&#xff0c;使用SpringBoot代理访问问题&#xff1a;访问过程中可能会出现400、404问题 前提&#xff1a;保证有文件&#xff0c;并且文件路径正确 SpringBoot如何配置静态资源代理&#xff0…

网络综合布线实训室建设方案

一、网络综合布线系统概述 网络综合布线系统是为了满足数据通信需求而设计和建立的一套基础设施。它提供了数据传输、信号传输和电力供应的基础结构&#xff0c;支持各种网络设备和终端设备之间的连接。 网络综合布线系统通常包括以下组成部分&#xff1a; 1&#xff09; 数据…

1.MySQL数据库的基本操作

数据库操作过程&#xff1a; 1.用户在客户端输入 SQL 2.客户端会把 SQL 通过网络发送给服务器 3.服务器执行这个 SQL,把结果返回给客户端 4.客户端收到结果,显示到界面上 数据库的操作 这里的数据库不是代表一个软件&#xff0c;而是代表一个数据集合。 显示当前的数据库 …

PHP基础

PHP&#xff08;外文名:PHP:Hypertext Preprocessor&#xff0c;中文名&#xff1a;“超文本预处理器”&#xff09;是一种免费开源的、创建动态交互性站点的强有力的服务器端脚本语言 <h1>My Name is LiSi!</h1> <script>console.log("This message is…

GuLi商城-前端基础Vue-使用Vue脚手架进行模块化开发

自己亲自实践&#xff1a; mac安装webpack webpack 简介Webpack 是一个非常流行的前端构建工具&#xff0c;它可以将多个模块&#xff08;包括CSS、JavaScript、图片等&#xff09;打包成一个或多个静态资源文件&#xff08;bundle&#xff09;&#xff0c;以便用于部署到生产…

测试人进阶技能:单元测试报告应用指南

为什么需要单元测试 从产品角度而言&#xff0c;常规的功能测试、系统测试都是站在产品局部或全局功能进行测试&#xff0c;能够很好地与用户的需要相结合&#xff0c;但是缺乏了对产品研发细节&#xff08;特别是代码细节的理解&#xff09;。 从测试人员角度而言&#xff0…