C++之string

news2024/10/10 14:23:51

目录

1、了解string

2、string相关函数

3、相关函数的使用

①构造函数

②赋值

 ③>>,<<

④operator[]

⑤size

⑥iterator(迭代器)

⑦push_back

⑧append

⑨+=

⑩capacity

⑪reserve

⑫resize

⑬insert

⑭erase

⑮c_str

⑯find

⑰substr

⑱getline

⑲to_string

⑳stoi/stod


STL是C++标准库的重要组成部分,是一个包罗数据结构与算法的软件框架

list/vector/string/deque都属于STL中的容器

下面就重点介绍string的用法

1、了解string

①string是表示字符串的字符串类

②string类是使用char作为它的字符类型

2、string相关函数

3、相关函数的使用

①构造函数

如图:

可以使用无参构造,也可以使用上图的第4中方式,一个常量字符串构造

这两个是最常用的,要注意不管是s1还是s2,它们的末尾都有一个/0


也可以进行拷贝构造:


还有可以拷贝一部分,即这个构造函数

意思是拷贝str,从pos位置拷贝到len位置,len位置的缺省参数npos

就是说npos是整型的最大值,即一个非常大的数

s2想拷贝从s1的第6个位置拷贝5个字符

这里还有一个注意事项,就是如果第三个参数大于pos后面的字符长度,那么也就是从pos位置拷贝完所有字符就结束

从第6个位置后面只有5个字符,那么我即使是输入的是10,也只打印剩下的5个字符

所以给npos这个缺省参数,就是用户如果没给打印几个字符,那么则从pos位置开始有多少就拷贝多少


②赋值

分别对应三种赋值重载


 ③>>,<<

并且重载了>>和<<运算符,就可以直接cin/cout了

即:


④operator[]

重载的[]可以让string类像数组一样去访问

普通对象就调用第一个,const对象就调用第二个

这里的返回值是引用,所以就可以修改返回值,也有减少拷贝的作用

operator[]也会检查越界 ,因为里面实现时用了assert,程序直接终止

还有一个at和[]用法基本一致,但是at越界的话是抛异常,不会像[]直接程序终止


⑤size

我们可以用size来进行循环中的判断,s1.size()就是s1字符串的长度

length和size用法也相同,但是由于string创建比较早,所以取名为length,而且也为了和后面要学习的其他容器保持一致,后面学习的树之类的再用length就不合适了,所以有了size,因此几乎不用length,都用size


⑥iterator(迭代器)

迭代器是一个像指针一样的东西,可能是指针也可能不是指针,但是用法像指针一样

迭代器的使用是以下的方式:

it是自己取的名字,叫什么都行

迭代器都是在内部定义的,所以属于这个类域,因此是string::iterator调用

s.begin()和s.end()就相当于:

 

所以每次*it然后++it就可以遍历出s1的内容

迭代器都给的是[),即左闭右开的区间,所以end()就是最后一个元素的下一个位置,所以这样it一直++到end(),就可以遍历完

看下图可知,begin和end返回的也是iterator

但是在string和vector中,我们不常用迭代器,一般用[],迭代器效率也比较低,[]更方便些也更快

但是到了list/map/set就不能用[]了,因为这些容器并不是连续的物理空间存储的,只能用迭代器访问,所以迭代器还是非常重要的,需要熟练掌握

iterator是所有容器的通用访问方式,用法是类似的,也就是你只要会用一个容器的迭代器,那你也自然就会用其他容器的迭代器了

学习了迭代器,这时候就需要提到范围for了,因为范围for使用起来方便,可以自动迭代,自动判断结束,而学习完迭代器我们就需要知道,范围for的底层其实就是用迭代器实现的

这两种方式都可以进行遍历,这里的iterator是正向迭代器


上面的iterator是正向迭代器,那既然有正向迭代器,自然也有反向迭代器

反向迭代器是reverse_iterator,里面用到的就是rbegin和rend了

正向迭代器是正着遍历,所以反向迭代器就是反着遍历了         

其中rbegin和rend的大概位置如下:

rend是第一个位置的前一个位置

rit++是朝左边动的


⑦push_back

push_back是插入一个字符


⑧append

push_back是插入一个字符串


⑨+=

上面的push_back和append能用,但是在string类中,重载了+=运算符,比上面两种方便很多

+=一个字符,+=一个字符串都很好用


⑩capacity

capacity是用于返回现阶段的容量


⑪reserve

reserve是用于提前开空间,避免扩容造成的损耗

s1.reserve(50)即提前开空间,有效的减少扩容造成的损耗


⑫resize

resize是用于提前开空间加初始化

比如s1.resize(50)则默认开的50个空间都初始化为0

如果想初始化为其他的,比如说初始化为a,则s1.resize(50,'a')即可


⑬insert

insert是指定位置插入字符或字符串

下面介绍最常用的一种

意思就是从0位置插入一个字符串“hello ”


⑭erase

erase是用于删除字符或字符串

常用的是第一个,给了两个缺省参数,意思是从pos位置删除len个字符

其中npos是一个非常大的数,也就是不给的话,就默认删除完剩下的字符

s1.erase(5)指从第5个字符开始,剩下的删完

s1.erase()指全部删完

但是这里说明一点,insert和erase少用,因为效果并不理想


⑮c_str

c_str是用于将字符串转化为c类型的字符串

而c类型的字符串的特点就是遇到\0就终止

而C++的字符串是按照size终止的,即打印完size个

c类型的字符串+='\0'打印时就终止了

C++则打印完所有的字符菜才终止


⑯find

find是用于查找字符或字符串

这里的返回值是size_t,也就是无符号整型

find当然会出现找到和没有找到两种情况,规定如果找到了就返回找到的第一个字符的位置,如果没有找到就返回npos,即整型的最大值

所以要用if语句判断返回值是否等于string::npos

也有一个rfind,这个是返回找到的最后一个字符的位置

主要用于打印最后一个后缀的情况,如:

我们只想要后缀.com,如果用find不符合要求

如上图,用rfind就能很好地解决


⑰substr

substr是取字符串的一部分

如下图,substr就是取出从pos开始的len个字符,也给了两个缺省值,不给pos就是从0开始取,不给len就是全部去完为止

substr经常与find结合起来使用


⑱getline

getline是用于输入字符串中有空格的情况

我们用的cin,如果输入两个字符串,输入完一个字符串空格或换行都可以完成两个字符串的分割

但是有一种情况如果要输入一个字符串中间有空格,用cin输入就会出现这种情况:

我们本来想要hello world,但是由于这个字符串中有空格,编译器误以为空格是多个字符串之间的分割,所以打印到空格就结束了,最终只打印了空格前的字符串,不满足要求  

用getline就可以完美解决这个问题了

 第一个用法是,在第三个参数中可以给一字符用于判断字符串结束标志

第二个用红框住的是常用用法,如下所示:


⑲to_string

to_string是转化为字符的函数,常见类型都可以转化


⑳stoi/stod

stoi/stod是字符转化为其他类型,同样常见的类型都可以转化

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

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

相关文章

简化转换器:使用您理解的单词进行最先进的 NLP — 第 1 部分 — 输入

一、说明 变形金刚是一种深度学习架构&#xff0c;为人工智能的发展做出了杰出贡献。这是人工智能和整个技术领域的一个重要阶段&#xff0c;但也有点复杂。截至今天&#xff0c;变形金刚上有很多很好的资源&#xff0c;那么为什么要再制作一个呢&#xff1f;两个原因&#xff…

代码随想录第43天|416. 分割等和子集,1049. 最后一块石头的重量 II, ​494.目标和,​ 474.一和零(一窍不通)

416. 分割等和子集 思路 本题是01背包的应用题 背包的体积为sum / 2背包要放入的商品&#xff08;集合里的元素&#xff09;重量为 元素的数值&#xff0c;价值也为元素的数值背包如果正好装满&#xff0c;说明找到了总和为 sum / 2 的子集。背包中每一个元素是不可重复放入…

(其他) 剑指 Offer 67. 把字符串转换成整数 ——【Leetcode每日一题】

❓ 剑指 Offer 67. 把字符串转换成整数 难度&#xff1a;中等 写一个函数 StrToInt&#xff0c;实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。 首先&#xff0c;该函数会根据需要丢弃无用的开头空格字符&#xff0c;直到寻找到第一个非空格的字符为…

C++学习笔记(堆栈、指针、命名空间、编译步骤)

C 1、堆和栈2、指针2.1、指针的本质2.2、指针的意义2.3、清空指针2.4、C类中的this 3、malloc and new4、命名空间4.1、创建命名空间4.2、使用命名空间 5、编译程序的四个步骤5.1、预处理5.2、编译5.3、汇编5.4、链接 1、堆和栈 堆&#xff08;heap&#xff09;和栈&#xff0…

领域驱动设计:DDD与微服务的关系

文章目录 基础概念软件架构模式的演进微服务设计和拆分的困境为什么 DDD 适合微服务&#xff1f;DDD 与微服务的关系 基础概念 DDD 虽然历史很久了&#xff0c;但它与微服务和中台设计的结合&#xff0c;却是一片很新的领域。早在 2003 年就诞生的 DDD&#xff0c;怎么来指导“…

基于spring boot+ vue开发的位置数据展现和分析平台源码 UWB源码

spring boot vue位置数据展现和分析平台源码 UWB室内外高精度定位系统源码 智慧工厂是现代工厂信息化发展的新阶段&#xff0c;基于UWB定位技术&#xff0c;融合位置物联网、GIS可视化等技术&#xff0c;实现对人员、物资精确管理。在重点区域设置电子围栏&#xff0c;无权限…

【Mysql】数据库第一讲(服务器数据库的安装和基础操作介绍)

数据库基础 &#x1f361;1.CentOs服务器数据库的安装&#x1f367;2.基础使用&#x1f368; 2.1 服务器&#xff0c;数据库&#xff0c;表关系&#x1f366;2.2使用案例&#xff1a; &#x1f967;3.数据库分类&#x1f9c1;4.存储引擎&#x1f370;4.Mysql库的操作&#x1f3…

YOLO目标检测——密集人群人头数据集+已标注yolo格式标签下载分享

实际项目应用&#xff1a;城市安防、交通管理、社会研究、商业应用、等多个领域数据集说明&#xff1a;YOLO密集人群人头目标检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;图片格式为jpg&#xff0c;共4300张图片。标注说明&#xff1a…

【web开发】6、Django(1)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Django是什么&#xff1f;二、使用步骤1.安装Django2.创建项目3.创建app4.快速上手 数据库操作1.安装第三方模块2.自己创建数据库3.DJango链接数据库4.DJango操…

ubuntu下查看文件(夹)大小的命令

记录下自己常用的查看文件夹和文件大小的命令。 1、查看当前所处的文件夹的整个大小&#xff08;只看当前文件夹大小&#xff09; du -sh2、查看当前文件夹中各个文件的大小 用-l或者-lh都行&#xff0c;加个h会增加可读性&#xff0c;如果想看具体某个文件&#xff0c;在后…

wires hark抓包内容解析

1.Frame 22001&#xff1a;这是该数据包的序号&#xff0c;表示wires hark已经捕获并显示了22001个数据包&#xff1b; 2.225 bytes on wire (1800 bits)&#xff1a;该数据的原始大小、以字节和比特显示&#xff1b; 3.225 bytes captured (1800 bits)&#xff1a;wires har…

元宇宙Web3.0科普---MoneyKing链游平台新格局介绍

众所周知&#xff0c;当前元宇宙“行业化”概念爆发后&#xff0c;当前社会甚至全世界再次步入一个全新的世界格局分水岭&#xff1b;随之而来的&#xff0c;包括了元宇宙具像化落地的Web3.0概念。 如果有人不懂什么是元宇宙&#xff0c;不懂什么是Web3.0&#xff0c;小编用最…

多线程与高并发——并发编程(5)

文章目录 五、线程池1 什么是线程池2 JDK自带的构建线程池的方式2.1 FixedThreadPool2.2 SingleThreadExecutor2.3 CachedThreaPool2.4 ScheduleThreadPool2.5 WorkStealingPool3 ThreadPoolExecutor应用&源码剖析3.1 为什么要自定义线程池3.2 ThreadPoolExecutor应用3.3 T…

数据透视表如何让多个行标签并列显示?

数据透视表如何让多个行标签并列显示&#xff1f; “数据透视表工具 - 报表布局" 这里有三种格式&#xff1a;&#xff08;1&#xff09;以压缩形式显示&#xff1b;&#xff08;2&#xff09;以大纲&#xff1b;&#xff08;3&#xff09;以表格形式。 选择“以表格显…

轻量容器引擎Docker基础使用

轻量容器引擎Docker Docker是什么 Docker 是一个开源项目&#xff0c;诞生于 2013 年初&#xff0c;最初是 dotCloud 公司内部的一个业余项目。 它基于 Google 公司推出的 Go 语言实现&#xff0c;项目后来加入了 Linux 基金会&#xff0c;遵从了 Apache 2.0 协议&#xff0c;…

MySQL-DDL语句

MySQL-DDL语句 数据库操作语句增删数据库查看数据库列表创建数据库进入&#xff08;使用&#xff09;数据库/查看当前所在的数据库查看数据库的建库语句查看数据库的编码集和校验集删除数据库修改数据库的编码集查看数据库支持的编码集和校验集 数据库备份备份单个数据库恢复数…

基于spring boot+ vue+ mysql开发的UWB室内外定位系统源码

现代制造业厂区面积大、人员数量多、物资设备不断增加&#xff0c;随着工业信息化技术的发展&#xff0c;大型制造企业中对人员、车辆、物资的管理要求越来越细致。 高精度定位管理系统使用UWB室内定位技术&#xff0c;通过在厂区安装定位基站&#xff0c;为人员或设备佩戴定位…

djanjo安装-各版本对应表

djanjo安装-各版本对应表 1 各版本对应表 django详细版本与python版本对照表&#xff0c;尽量按照表中的版本对应安装 2 djanjo安装 pip install django2.2.* // 默认会安装:Django2.2的最新版本2.2.28和对应的sqlparse-0.4.4、pytz等包python -m django --version // 检测…

抖店的产品是怎么卖出去的?带你了解抖店的核心玩法,不需要直播

我是王路飞。 你认为抖店就是在抖音开直播&#xff0c;然后把产品吆喝着卖出去吗&#xff1f; 如果你是这样看待抖店的话&#xff0c;那只能说明你根本不了解抖音小店&#xff0c;也不了解抖音的带货模式。 今天就给你们讲一下抖店的产品都是怎么卖出去的。 带你了解抖店的…

【Terraform】Terraform自动创建云服务器脚本

Terraform 是由 HashiCorp 创建的开源“基础架构即代码”工具 &#xff08;IaC&#xff09; 使用HCL&#xff08;配置语言&#xff09;描述云平台基础设施&#xff08;这里教你使用低级基础设施&#xff1a;交换机、云服务器、VPC、带宽&#xff09; Terraform提供者&#xf…