【string 类的使用方法(总结)】

news2024/11/24 5:06:17

1. 为什么学习string类?

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

2. 标准库中的string

2.1 string(了解)

<string类的文档介绍>

(推荐大家以后查文档时都在这上面查询,这个网站排版比较好)

1. 字符串是表示字符序列的类 。
2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。
3. string 类是使用 char( 即作为它的字符类型,使用它的默认 char_traits 和分配器类型 ( 关于模板的更多信息,请参阅 basic_string)
4. string 类是 basic_string 模板类的一个实例,它使用 char 来实例化 basic_string 模板类,并用 char_traits和 allocator 作为 basic_string 的默认参数 ( 根于更多的模板信息请参 basic_string)
5. 注意,这个类独立于所使用的编码来处理字节 : 如果用来处理多字节或变长字符 ( UTF-8) 的序列,这个类的所有成员 ( 如长度或大小 ) 以及它的迭代器,将仍然按照字节 ( 而不是实际编码的字符 ) 来操作。

 总结:

1. string 是表示字符串的字符串类 。
2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作 string 的常规操作。
3. string 在底层实际是: basic_string 模板类的别名, typedef basic_string<char, char_traits, allocator>string。
4. 不能操作多字节或者变长字符的序列。

 使用string类时,必须包含#include头文件以及using namespace std

2.2 string类的常用接口说明

1. string类对象的常见构造

<常见构造的文档介绍>

函数名称
功能说明
string() (重点)
构造空的 string 类对象,即空字符串
string(const char* s) (重点)
C-string 来构造 string 类对象
string(const string&s) (重点)
拷贝构造函数
string(size_t n, char c)
string 类对象中包含 n 个字符
void Teststring()
{
 string s1; // 构造空的string类对象s1
 string s2("hello bit"); // 用C格式字符串构造string类对象s2
 string s3(s2); // 拷贝构造s3
}

2. string类对象的容量操作

函数名称功能说明
size (重要)
返回字符串有效字符长度
empty (重要)
检测字符串释放为空串,是返回 true ,否则返回 false
clear (重要)
清空有效字符
reserve (重要)
为字符串预留空间
resize (重要)
将有效字符的个数改成 n 个,多出的空间用字符 c 填充
lengh
返回字符串有效字符长度
capacity
返回空间总大小
注意:
  • 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不会改变容量大小。

int main()
{
	string s1("hello world");
	s1.reserve(10);
	s1.resize(6, 'q');
	return 0;
}

我们可以调试起来试试:

 当运行到reserve时:

 我们发现当参数小于size时改操作对参数几乎没影响。

当运行到resize时:

 这里参数就可以改变size,但是不改变容量大小。

另外要注意的是当reserve参数大于size时就会开出大于参数的空间,具体是多少由编译器决定,resize的第一个参数大于size时也会扩大空间,同时还将size扩大到n,在原始数据上将后面数据初始化为ch.

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

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

begin

end

begin 获取一个字符的迭代器 + end 获取最后一个字符下一个位置的迭代器
rbegin  rend
begin 获取一个字符的迭代器 + end 获取最后一个字符下一个位置的迭代器
范围for
C++11 支持更简洁的范围 for 的新遍历方式
int main()
{
	string s1("hello world");
	string::iterator it = s1.begin();
	//auto it = s1.begin();  //这种方式遍历也可以
	while (it != s1.end())
	{
		*it += 1;//写
		cout << *it << " ";//读
		it++;
	}

	return 0;
}

在string类中,这个迭代器的用法类似于指针的用法,但并不是在所有类中都是这个用法,至于rbegin和rend就是倒着遍历这里就不举例子了,另外C++11新引进的范围for的底层实现就是基于迭代器,这里我们后面在string类的模拟实现会讲到。

4. string类对象的修改操作

函数名称
功能说明
push_back
在字符串后尾插字符
append
在字符串后追加一个字符串
opreator+=
在字符串后追加字符串 str
c_str
返回 C 格式字符串
find + npos
从字符串 pos 位置开始往后找字符 c ,返回该字符在字符串中的位置
rfind
从字符串 pos 位置开始往前找字符 c ,返回该字符在字符串中的位置
substr
str 中从 pos 位置开始,截取 n 个字符,然后将其返回
注意:
1. string 尾部追加字符时, s.push_back(c) / s.append(1, c) / s += 'c' 三种的实现方式差不多,一般情况下 string 类的 += 操作用的比较多, += 操作不仅可以连接单个字符,还可以连接字符串。
2. string 操作时,如果能够大概预估到放多少字符,可以先通过 reserve 把空间预留好。

 我们可以来试试查找字符串的用法:

string s("hello world.txt");//获取到后缀
	size_t pos = s.find('.', 0);
	for (int i = pos + 1; i < s.size(); i++)
		cout << s[i];

这种方式可以获取到,但是如果字符串是这种形式的呢?

"hello world.txt.cpp"

我们想获取最后一个后缀就必须的用rfind.

string s("hello world.txt.cpp");//获取到后缀
	size_t pos = s.rfind('.');
	for (int i = pos + 1; i < s.size(); i++)
		cout << s[i];

不知道大家注意到了没有,我这里rfing是没有给第二个参数的,我们可以到官网上看看rfind的声明:

 不难发现pos给了一个缺省值为npos,那npos又是什么鬼呢?

官方是这样给的:

 npos就是-1转化成无符号整数,通俗来说npos就是一个string类所能够取到的最大长度。上面我们没有给第二个参数它就会从字符串末尾开始找,只要字符串长度不超过npos.

5. string类非成员函数

函数
功能
operator+
尽量少用,因为传值返回,导致深拷贝效率低
operator>> (重要)
输入运算符重载
operator<< (重要)
输出运算符重载
getline (重要)
获取一行字符串
relational operators (重要)
大小比较
上面的几个接口大家了解一下, 大家也可以自己去找一些OJ题来练习一下使用。 string 类中还有一些其他的操作,这里不一一列举,大家在需要用到时不明白了查文档即可。

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

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

相关文章

采用NVIDIA Jetson Orin NX 系统的视觉边缘计算机

边缘计算机采用NVIDIA Jetson Orin NX模块化系统和高带宽图像采集卡&#xff0c;用于实时图像采集计算和人工智能处理。虹科的合作伙伴Gidel是一家专注于高速图像采集和处理的以色列科技公司&#xff0c;今天宣布新的NVIDIA Jetson Orin NX™ 16GB模块化系统(SoM)将被添加到Gid…

SpringSecurity配置及使用

Spring Security 是针对Spring项目的安全框架&#xff0c;也是Spring Boot底层安全模块默认的技术选型&#xff0c;他可以实现强大的Web安全控制&#xff0c;对于安全控制&#xff0c;我们仅需要引入spring-boot-starter-security 模块&#xff0c;进行少量的配置&#xff0c;即…

什么是渲染农场,渲染农场一般怎么收费?

对于用3D软件创作效果图或影视动画的艺术家们来说&#xff0c;应该对渲染农场并不陌生&#xff0c;但是对于初入CG行业的人来说&#xff0c;看到网上很多人说渲染农场&#xff0c;肯定会疑惑&#xff0c;什么是渲染农场&#xff1f;渲染农场也叫“分布式并行集群计算系统”&…

【6】【vue3+elementplus+springboot】 管理系统 【前后端实践】

第一部分&#xff1a; elementplus官网&#xff1a;一个 Vue 3 UI 框架 | Element Plus (element-plus.org) 1、安装elementplus npm install element-plus --save查看package.json中存在依赖表示成功安装 2、引入elementplus import ElementPlus from element-plus import …

论文解读 - 城市自动驾驶车辆运动规划与控制技术综述 (第5部分,完结篇)

文章目录&#x1f697; V. Vehicle Control&#xff08;车辆控制&#xff09;&#x1f534; A. Path Stabilization for the Kinematic Model&#xff08;基于运动学模型的路径稳定&#xff09;&#x1f7e5; 1&#xff09;Pure Pursuit&#xff08;纯追踪&#xff09;&#x1…

H3C SecParh堡垒机任意用户登录与远程执行代码漏洞

H3C SecParh堡垒机任意用户登录与远程执行代码漏洞1.H3C SecParh堡垒机任意用户登录漏洞1.1.漏洞描述1.2.漏洞影响1.3.漏洞复现1.3.1.登录页面1.3.2.构建URL1.4.总结2.H3C SecParh堡垒机远程命令执行漏洞2.1.漏洞描述2.2.漏洞影响2.3.漏洞复现2.3.1.登录页面2.3.2.构建URL2.4.总…

python-pptx 操作PPTx幻灯片文件删除并替换图片

python-pptx 操作PPTx幻灯片文件删除并替换图片 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、原理 通过查找ppt中的图片指纹替换 二、操作流程 原始ppt如下&#xff1a; 根据…

[单片机] MCU串口发送C方案优化

应用场景&#xff1a; 主频不高非操作系统的单片机&#xff0c;需要在while循环中发送 数据到上位机&#xff0c;当数据较长时&#xff0c;会让发送的过程会让其他操作有卡顿感。为了解决这个问题&#xff0c;需采用一种方法&#xff1a;在每次大循环中只发一个字节数据&#x…

HTML5+CSS3(一)-全面详解(学习总结---从入门到深化)

目录 ​编辑 第一个前端程序 学习效果反馈 前端工具的选择与安装 前端常见开发者工具 浏览器 VSCode中文语言包安装&#xff1a; 学习效果反馈 VSCode开发者工具快捷键 VSCode常用快捷键列表 学习效果反馈 HTML5简介与基础骨架 HTML5的DOCTYPE声明 HTML5基本骨架 html…

Linux(CentOS Stream 9)安装MySQL8.0

mysql8下载链接 链接&#xff1a;https://pan.baidu.com/s/1yBCDbDYUmQWjcM1SdS7Xng 提取码&#xff1a;t37m 上传到服务器上并解压 cd /usr/localtar -xvf mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz解压包重命名为mysql mv mysql-8.0.21-linux-glibc2.12-x86_64 /usr/l…

Linux部署RKNN-toolkit过程以及异常点记录(详细记录)

文章目录Linux部署RKNN-toolkit过程以及异常点记录1.在Linux中安装Miniconda1.1 使用服务器下载Miniconda1.2 安装conda1.3 激活刚安装完成的软件1.4参考博文2.创建并激活Miniconda新环境&#xff08;rknn&#xff09;2.1 创建conda环境&#xff08;命名为rknn&#xff09;2.2 …

做亚马逊、沃尔玛测评自养号大额、退款一定要解决的几个问题?

大家好我是测评龙哥&#xff0c;今天我跟大家说下做亚马逊、沃尔玛测评自养号、退款、lu货、项目需要用到的防关联、防封号环境的一些底层技术原理。这里讲的内容我相信很少有人能掌握&#xff0c;都是一些比较难的IT术技。 如果你现在准备开始做测评是在了解阶段还是已经在做…

SRM-询报价管理系统搭建指南

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建SRM-询报价管理。1.2、应用场景企业根据询价需求通知参与报价的供应商&#xff0c;所有供应商会收到通知后进行报价&#xff0c;自动生成了比价数据&#xff0c;企业可参考比价数据对供应商进行选择。2、设置方法2.1、表单搭…

GF_CLR初始用 - 正式版

参照&#xff1a;DeerGF_Wolong框架使用教程 与tackor老哥的踩坑日记所编写&#xff0c;第二次尝试&#xff0c;总结第一次经验重新来。 点击链接加入群聊【Gf_Wolong热更集合】 一. 部署 HybridCLR(Wolong) 环境 首先安装Windows Build Support (IL2CPP)需要完整的克隆项目…

自动驾驶感知——激光雷达物体检测算法

文章目录1. 基于激光雷达的物体检测1.1 物体检测的输入与输出1.2 点云数据库1.3 激光雷达物体检测算法1.3.1 点视图1.3.1.1 PointNet1.3.1.2 PointNet1.3.1.3 Point-RCNN1.3.1.4 3D-SSD1.3.1.5 总结和对比1.3.2 俯视图1.3.2.1 VoxelNet1.3.2.2 SECOND1.3.2.3 PIXOR1.3.2.4 AFDe…

2023年Java学到什么程度可以找工作了?

不管是过去现在还是未来&#xff0c;任何以就业为目的的学习&#xff0c;参考的就业要求最直接的方式就是直接去搜索目标岗位企业的招聘要求。是不是很简单呢&#xff01;下面是根据Java不同技术层次列举招聘要求&#xff1a;初级Java开发工程师&#xff1a;中级Java开发工程师…

出现这些症状,说明你的免疫力在走下坡路!

这些年免疫力逐渐成为大家关注的重点。随着身边越来越多的人感染&#xff0c;免疫力的强弱影响着每个人身体的恢复情况&#xff0c;好的免疫力就是最有效的药物。免疫力讲究平衡二字&#xff0c;太强、太弱都不好。太强会让机体过于敏感&#xff0c;对非致病因素也发起攻击&…

网络故障监控某小程序延时分析案例

背景 某港口集疏港系统近期出现故障&#xff0c;在凌晨3-5点时段无法上传疫情通勤卡&#xff0c;对港口货物运输带来影响。 该港口已部署NetInside全流量回溯系统&#xff0c;针对本次故障&#xff0c;进行故障定位和原因分析。 分析简介 操作时间&#xff1a;2022年9月8日星…

【C++】C++入门 命名空间 及输入与输出

前言 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等。熟悉C语言之后&#xff0c;对C学习有一定的帮助。 C补充C语言语法的不足&#xff0c;以及对C语言设计不合理的地方进行优化&#xff0c;比如&#x…

联想昭阳K4e电脑系统错误导致屏幕闪烁怎么重装系统?

联想昭阳K4e电脑系统错误导致屏幕闪烁怎么重装系统&#xff1f;有用户安装的电脑系统有兼容性错误&#xff0c;导致电脑开机之后&#xff0c;屏幕会不断的进行闪烁&#xff0c;无法正常的进行电脑操作。那么这个情况我们如何去进行电脑系统的重装呢&#xff1f;今天教大家U盘重…