C++ 中的string类

    本文主要通过文档形式使用C++中string类的常见接口进行介绍,然后我们自己实现一个string类


标准库中的string

使用库中的string类时,必须包含头文件:#include<string>, 以及 using namespace std

string 构造函数

首先我们来看构造函数,在库函数中,string类给我们提供了多达七个构造函数接口

在这里我们主要介绍四个常见的构造:

1.string()   构造空的string类对象,即空串

        

     

          当我们进行调试时可以看到,string()的确构造了一个空串:

        在类与对象中我们也以及了解到,构造函数会对对象进行初始化操作,在这里s1的大小和最大容量被成功初始化!

2. string(const char*)    用string类对象来构造string类对象

       在这里,我们将字符串Hello world来构造string对象,运行并调试,可以看到s1已经被字符串成功构造

       

3. string(const string&s)     拷贝构造函数

              拷贝构造函数是使用同类对象初始化创建对象,也就是用已经存在的对象取创建一个还未创建的对象

        注意:需要理清 拷贝构造 和 赋值拷贝 !!! 

        拷贝构造是用一个已经存在的对象来对创建一个还未被创建的对象

        赋值拷贝是用一个已经存在的对象来给一个已经存在的对象进行赋值

int main()
{string s1("Hello world");//拷贝构造,s2还没被创建,用s1来创建对象s2string s2(s1);string s3;//赋值拷贝,s3在上面已经被创建,s2的值赋给s3s3 = s2;//s1,s2,s3的结果是一样的cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;return 0;
}

        

4. string(size_t n,char c)

        string类对象中包含n个字符c,通俗的来讲,就是用n个字符c来构造对象

        这个构造函数用的不多,在这里就不多赘述 


迭代器

         在C++中有迭代器这个东西,它其实是个像指针一样的对象,用法也和指针也很相似,但是迭代器并不是指针!!!

auto关键字

        在编程时使用auto,可以提高我们的编写效率,但是也有缺陷。

1.auto可以自动推导变量类型,但是必须始终推导为同一类型

        a时int类型,auto会根据a的类型自动推导b的类型,c会根据b的类型进行推导

也就是:

        int(a)--->int(b)--->int(c)

2.包含auto的符号必定要有初始设定值,不然它就不会推导了

3.auto声明指针时,auto和auto*是没有区别的

4.auto不能作为函数的参数,但是可以作为函数的返回值

5.auto不能直接用来声明数组

范围for 

适用于容器遍历和数组遍历,范围for会自动迭代,自动取数据,自动判断结束

自动取容器的数据赋值给左边的对象,自动++,自动判断结束

注意:迭代器变量出了范围for后生命周期就结束了,本质上并没有改变原对象,如果我们想通过范围for修改原对象,,需要加上引用


string 类对象的容量操作 

在这里只讲解常用的容量操作接口

1.size()   返回字符串的有效长度

          返回的单位是字节,返回的长度不一定等于最大容量!

        size和length都是返回字符串有效长度,底层实现原理也相同,但是基本都是使用size() 

2.resize()   将有效字符的个数改成n个,多出的空间用字符c填充

3.empty()   判断是否为空串

        返回类型是bool,只作简单的空串判断

   

4.clear()   清空有效字符

        clear只做简单的有效字符清空工作,返回值为空

5.reserve()   调整/预留空间

        对于一个string类,类成员有  size(当前串的有效长度)  和  capacity(最大容量),那么这就意味着当我们对string对象进行字符串追加时,有可能会遇到最大容量扩容的问题,要知道扩容是会消耗性能的,如果我们创造一个长度非常夸张的string对象,那么扩容的次数可能会直线上升,为了解决这一问题,string类提供了一个reserve接口,能让我们自己创建string对象时调整最大容量

注意,reserve并不会改变原本字符串的有效个数,仅仅改变最大容量 

如果预知一个串非常大的情况下,利用reserve提前开空间避免扩容,减少了性能的消耗

        如果reserve的参数小于string的底层空间总大小时,那么此时reserve不会改变最大容量

 string 类对象的访问和遍历

        string类对象本质上就是字符串,在数据结构上是顺序表,顺序表的底层结构是数组,我们可以利用看待数组的思维来对待string类对象。

        string类对象的访问和遍历,和顺序表的访问和遍历没有什么区别,通过下标或者指针均可

1.begin()   获取一个字符的迭代器 

2.end()   获取最后一个字符的下一个位置的迭代器 

        end获得的不是最后一个字符的位置,而是最后一个字符的下一个位置!end()-1才是最后一个字符的位置

3.operator[ ]  返回pos位置的字符

在string类中,[ ]运算符重载,使其能像数组一样通过下标获取字符,pos位置一定要合法

4.范围for 

前面介绍范围for时已经讲解,不再重复

string类对象的修改操作

1.push_back    在字符串后尾插字符

        尾插字符后,字符串的长度+1

2.append         字符串后追加字符串

        append可以在字符串后追加字符串,也可以追加对象

        append也可以在字符串后填充n个字符

        append的使用也可以带上迭代器一起使用,按相同的顺序附加范围 [first,last) 中的字符序列的副本。

3.operator+=    字符串后追加字符串str

        在string类中,+=符号进行了运算符重载,实现了字符串追加的功能

        我们可以通过+=追加string对象,字符串或者单个字符,在OJ题中这是个常用的接口

4.c_str   返回C格式字符

        返回一个指向数组的指针,此数组包含构成字符串对象值的相同字符序列,以及末尾的附加终止 null 字符 ('\0')

        注意:返回的是一个被const修饰的指针!

 5.replace   替换字符串的一部分

        不建议常使用,如果是一个字符替换成另一个字符还好,不会有空间位置的挪动

6.find   在字符串中搜索由其参数指定的序列的第一个匹配项。

 

当然,find也能用来寻找串

7.rfind   从后面倒着找

        我们知道,当我们需要判断一个文件是什么类型时,都是看它的后缀,但可曾想,一个文件有多个后缀,如Helloworld.txt.zip,.zip才是它真正的文件类型,这时候从后倒着找就非常的方便了

而关于rfind的使用,结合下面substr一起看 

8.substr   在str中从pos位置开始,截取n个字符,然后将其返回

        如果在参数中没有写明截取字符的个数,默认截取到字符串的末尾

substr和rfind的联合使用,对查找文件类型非常的高效,代码也非常的简洁明了  

9.insert   在字符串pos位置插入字符串

10.erase   擦除字符串的一部分,减少其长度

刚刚我们通过insert插入了一串字符,我们也可以通过erase擦除字符串的一部分 


 string类对象的非成员函数

而有关非成员函数,这里只介绍一个getline

getline

有两个字符串,需要你存数据:

字符串一:Hello world!

字符串二:Helloworld!

        可是当我们想往这两个串里cin数据时,却根本达不到想要的效果 ,因为当我们按下空格时,编译器默认认为我们已经完成了对串的输入,转而进行下一个串的输入,也就是说,当我们使用cin时无法存储空格字符

         

这时候就时getline展现的时候了,getline不仅可以将空格存入字符串中,还能自定义终止输入符

 


现在是2024年11月15日下午16:01

这篇博客其实还能补充很多内容,但是越写越累,索性不写了,缺的内容在以后的博客里填上,毕竟都周五下午了

有双休的打工人已经开始紧盯时间准备卡点下班,没双休的打工人已经开始幻想有双休的工作是怎么样的,而我这种清澈且愚蠢的大学生已经开始喃喃自语:我TM又活了一周!

有感而发:学习好啊,还是得学啊,图书馆的妹子真好看,这C++也越学越难受,上坡路走不完

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html + css 自适应首页布局案例

文章目录 前言一、组成二、代码1. css 样式2. body 内容3.全部整体 三、效果 前言 一个自适应的html布局 一、组成 整体居中&#xff0c;宽度1200px&#xff0c;小屏幕宽度100% 二、代码 1. css 样式 代码如下&#xff08;示例&#xff09;&#xff1a; <style>* {…

Python知识点精汇!字符串:定义、截取(索引)和其内置函数

目录 一、字符串的定义 二、字符串的截取 1.截取干啥的 2.怎么用截取 3.打印多次 4.两个字符串拼接在一起 三、字符串内置函数 1.查询函数&#xff1a; &#xff08;1&#xff09;find(str,start,end) &#xff08;2&#xff09;index&#xff08;str,start,end&#…

mindspore发布件

MindSpore Repohttps://repo.mindspore.cn/ MindSpore Repohttps://repo.mindspore.cn/mindspore-lab/mindnlp/newest/any/

MySQL技巧之跨服务器数据查询:基础篇-A数据库与B数据库查询合并

MySQL技巧之跨服务器数据查询&#xff1a;基础篇-A数据库与B数据库查询合并 上一篇已经描述&#xff1a;借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的链接名: MY_ODBC_MYSQL 以…

计算机视觉在自动驾驶汽车中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 计算机视觉在自动驾驶汽车中的应用 计算机视觉在自动驾驶汽车中的应用 计算机视觉在自动驾驶汽车中的应用 引言 计算机视觉在自动…

2024-11-16-机器学习方法:无监督学习(1) 聚类(上)

文章目录 机器学习方法&#xff1a;无监督学习&#xff08;1&#xff09; 聚类&#xff08;上&#xff09;1. 聚类的基本概念1.1 聚类的概念1.2 聚类的功能1.3 聚类的算法 2. 相似度或距离2.1 闵可夫斯基距离2.2 相关系数2.3 夹角余弦 3 类或簇3.1 类的特征 4 类与类之间的距离…

计算机网络WebSocket——针对实习面试

目录 计算机网络WebSocket什么是WebSocket&#xff1f;WebScoket和HTTP协议的区别是什么?说明WebSocket的优势和使用场景&#xff1f;说明WebSocket的建立连接的过程&#xff1f; 计算机网络WebSocket 什么是WebSocket&#xff1f; WebSocket是一个网络通信协议&#xff0c;提…

STM32设计防丢防摔智能行李箱

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着科技的不断发展&#xff0c;嵌入式系统、物联网技术、智能设备…

PaoluGPT——千里挑一

开启题目&#xff1a; 点击“开始聊天”&#xff0c;发现已经跑路&#xff1a; 点击“查看聊天记录”&#xff0c;会发现一大堆聊天记录&#xff1a; 聊天记录在/list目录下 点两个具体的聊天记录&#xff0c;发现地址栏中URL发生变化&#xff0c;都是 /view?conversation_id…

L11.【LeetCode笔记】有效的括号

目录 1.题目 2.分析 理解题意 解决方法 草稿代码 ​编辑 逐一排错 1.当字符串为"["时,分析代码 2.当字符串为"()]"时,分析代码 正确代码(isValid函数部分) 提交结果 3.代码优化 1.题目 https://leetcode.cn/problems/valid-parentheses/descri…

paddle表格识别数据制作

数据格式 其中主要数据有两个一个表格结构的检测框&#xff0c;一个是tokens&#xff0c;注意的地方是 1、只能使用双引号&#xff0c;单引号不行 2、使用带引号的地方是tokens里面 "<tr>", "<td", " colspan2", ">",&quo…

深度学习中的Pixel Shuffle和Pixel Unshuffle:图像超分辨率的秘密武器

在深度学习的计算机视觉任务中&#xff0c;提升图像分辨率和压缩特征图是重要需求。Pixel Shuffle和Pixel Unshuffle是在超分辨率、图像生成等任务中常用的操作&#xff0c;能够通过转换空间维度和通道维度来优化图像特征表示。本篇文章将深入介绍这两种操作的原理&#xff0c;…

阮一峰科技爱好者周刊(第 325 期)推荐工具:一个基于 Next.js 的博客和 CMS 系统

近期&#xff0c;阮一峰在科技爱好者周刊第 325 期中推荐了一款开源工具——ReactPress&#xff0c;ReactPress一个基于 Next.js 的博客和 CMS 系统&#xff0c;可查看 demo站点。&#xff08;fecommunity 投稿&#xff09; ReactPress&#xff1a;一款值得推荐的开源发布平台 …

Amazon Web Services (AWS)

一、Amazon Web Services (AWS)介绍 1、简介 2、产品 AWS 提供了各种云计算服务&#xff0c;包括 DynamoDB、S3、EC2、Lambda 等等。 登录aws后点击所有服务也可以看到amazon的所有服务&#xff1a; 3、免费试用产品 除了免费的Amazon Step Functions、Amazon Lambda&#…

rk3399开发环境使用Android 10初体验蓝牙功能

版本 日期 作者 变更表述 1.0 2024/11/10 于忠军 文档创建 零. 前言 由于Bluedroid的介绍文档有限&#xff0c;以及对Android的一些基本的知识需要了(Android 四大组件/AIDL/Framework/Binder机制/JNI/HIDL等)&#xff0c;加上需要掌握的语言包括Java/C/C等&#xff0…

Redis实战案例(黑马点评)

List item Redis实战案例&#xff08;黑马点评&#xff09; 一、短信登录 tomcat的运行原理&#xff1a; 当用户发起请求时&#xff0c;会访问tomcat注册的端口&#xff0c;任何程序想要运行&#xff0c;都需要有一个线程对当前端口号进行监听&#xff0c;当用户和tomcat连…

每行数据个数在变的二维数组的输出

#include<stdio.h> int main() {//定义四个一维数组int arr1[1] { 1 };int arr2[3] { 1,2,3 };int arr3[5] { 1,2,3,4,5 };int arr4[7] { 1,2,3,4,5,6,7 };//把四个一维数组放进一个二维数组int* arr[4] { arr1,arr2,arr3,arr4};//预先计算好每一个数组真实的长度in…

IPv6 NDP 记录

NDP&#xff08;Neighbor Discovery Protocol&#xff0c;邻居发现协议&#xff09; 是 IPv6 的一个关键协议&#xff0c;它组合了 IPv4 中的 ARP、ICMP 路由器发现和 ICMP 重定向等协议&#xff0c;并对它们作出了改进。该协议使用 ICMPv6 协议实现&#xff0c;作为 IPv6 的基…

MySQL数据库:SQL语言入门 【2】(学习笔记)

目录 2&#xff0c;DML —— 数据操作语言&#xff08;Data Manipulation Language&#xff09; &#xff08;1&#xff09;insert 增加 数据 &#xff08;2&#xff09;delete 删除 数据 truncate 删除表和数据&#xff0c;再创建一个新表 &#xff08;3&#xf…

第二十一周机器学习笔记:动手深度学习之——数据操作、数据预处理

第二十周周报 摘要Abstract一、动手深度学习1. 数据操作1.1 数据基本操作1.2 数据运算1.2.1 广播机制 1.3 索引和切片 2. 数据预处理 二、复习RNN与LSTM1. Recurrent Neural Network&#xff08;RNN&#xff0c;循环神经网络&#xff09;1.1 词汇vector的编码方式1.2 RNN的变形…