【C++篇】探索STL之美:熟悉使用String类

CSDN

文章目录

前言

💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力!

👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!
🚀 分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对C++感兴趣的朋友,让我们一起进步!

C++ string 类从入门到精通: 

1. string简介

C++ 标准库中的 std::string 类是一个非常强大的工具,用于处理和操作字符串。它属于 <string> 头文件,并提供了一套丰富的功能和方法。以下是 std::string 类的一些主要特性和常用操作:

 字符串是表示字符序列的类
 1. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。
2. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信 息,请参阅basic_string)。
3. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits allocator(配置器)作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。
 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个 类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。
总结:
 string是表示字符串的字符串类
该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string;
不能操作多字节或者变长字符的序列。
在使用string类时,必须包含#iostream头文件以及using namespace std;

2. string 类的构造及基本接口函数
2.1 string 类的构造方法

string 类支持多种构造方式,以下是常见的构造函数: 

 下面简单演示上述多个函数如何使用和了解其功能,代码如下:

2.1.1 示例:
#include<iostream>
using namespace std;int main()
{string s2("hello world");string s1;//构造一个空的字符串string s3("C++");//使用字符串C++构造s3对象string s4(10, 'c');//构造包含10个'c'的s4对象string s5(s2);//使用s2拷贝构造s5cout <<"s1:"<< s1 << endl;cout <<"s3:"<< s3 << endl;cout <<"s4:"<< s4 << endl;cout <<"s5:"<< s5 << endl;return 0;
}

输出结果: 

s1:
s3:C++
s4:cccccccccc
s5:hello world

 2.2 String类 常见的操作

#include<iostream>
using namespace std;
int main()
{string s2("hello world");cout << s2 << endl;cout << s2.size() << endl;cout << s2.length() << endl;cout << s2.capacity() << endl;s2.resize(5);cout << s2 << endl;//cout << s2.reserve() << endl;s2.clear();if (s2.empty())cout << "s2为空字符串" << endl;else {cout << "s2不为空字符串" << endl;}s2.resize(100);cout << s2 << endl;return 0;
}
2.2.1 示例:

hello world
11
11
15
hello
s2为空字符串

补充:resize使用示例: 

#include <iostream>
#include <string>
using namespace std;int main() {string s = "Hello";cout << "Size: " << s.size() << endl;     // 返回字符串长度cout << "Capacity: " << s.capacity() << endl;  // 返回容量s.resize(10, 'X');                        // 将长度改为10,多出部分用'X'填充cout << "Resized: " << s << endl;s.clear();                                // 清空字符串cout << "Is empty: " << s.empty() << endl;  // 检查是否为空return 0;
}

输出结果:

Size: 5
Capacity: 15
Resized: HelloXXXXX
Is empty: 1

注意: 

1. resize(size_t n)resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不 同的是当字符个数增多时:resize(n)用'\0'来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
2. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserve不会改变容量大小。
3. sizecapacity都不包括’\0’。

 2.3 字符串的遍历与访问

常见字符串遍历方法接口(interface):

2.3.1 示例: 
#include<iostream>
#include<string>
using namespace std;
int main()
{string s2("hello world");s2[0] = 'x';cout << s2 << endl;cout<<s2.at(1) << endl;//返回指定位置的对象string::iterator it = s2.begin();//迭代器遍历while (it != s2.end()){cout << *it;++it;}cout << endl;//范围for,auto自动推导类型for (auto it = s2.begin(); it != s2.end(); it++)cout << *it;cout << endl;return 0;
}

输出结果: 

xello world
e
xello world
xello world

3. string类 高级接口(interface) 
3.1 字符串的查找操作

常见查找接口如下:

C++中string::npos的概念,它是size_t的最大值,表示字符串结束

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;int main()
{string s1("hello world hello bit!");//find的使用//在字符串中查找子字符串或字符,返回其首次出现的位置,找不到则返回 string::npossize_t ret = s1.find('e');if (ret == string::npos)printf("未找到!\n");else{cout << "ret:"<<ret << endl;}size_t ret2 = s1.find('o');if (ret2 == string::npos)printf("未找到!\n");else{cout << "ret2:" << ret2 << endl;}//rfind的使用//反向查找字符串,返回最后一次出现子串或字符的位置size_t ret3 = s1.rfind('o');if (ret3 == string::npos)printf("未找到!\n");else{cout << "ret3:" << ret3 << endl;}//find_first_of()	//查找指定字符集中的任意一个字符,返回第一次出现的索引size_t ret4=s1.find_first_of("b");if (ret4 == string::npos)printf("未找到!\n");else{cout << "ret4:" << ret4 << endl;}size_t ret5 = s1.find_first_of("bit");if (ret5 == string::npos)printf("未找到!\n");else{cout << "ret5:" << ret5 << endl;}size_t ret6 = s1.find_last_of('t');if (ret6 == string::npos)printf("未找到!\n");else{cout << "ret6:" << ret6 << endl;}size_t ret7 = s1.find_last_of("bi");if (ret7 == string::npos)printf("未找到!\n");else{cout << "ret7:" << ret7 << endl;}return 0;
}

输出结果: 

ret:1
ret2:4
ret3:16
ret4:18
ret5:18
ret6:20
ret7:19

3.1.1 相关链接
  • C++ string::find() 文档
  • C++ string::rfind() 文档
  • C++ string::find_first_of() 文档
  • C++ string::find_last_of() 文档
3.2 字符串的比较操作

这几个接口比较简单,日期类实现过,这里就不再重复了.

3.3 字符串的替换操作

3.3.1 相关链接
  • C++ string::replace() 文档

 3.3.2 示例:

#include<iostream>
using namespace std;int main()
{//我们将wzy换成C++string s1("hello wzy hello java!");cout << s1 << endl;s1.replace(6, 3, "C++");//将string s1开始的第六个字符的后面三个字符换成C++cout << s1 << endl;return 0;
}

输出结果:

hello wzy hello java!
hello C++ hello java!

3.4 字符串的截取操作

3.4.1 示例:
#include<iostream>
using namespace std;int main()
{string s1("hello wzy hello java!");string s2=s1.substr(10, 11);//cout << s2 << endl;return 0;
}

输出结果: 

hello wzy hello java!
hello java!

 

3.4.2 相关链接
  • C++ string::substr() 文档
3.5 字符串的插入与删除操作

 

补充: 由于C++是很注重效率的编程语言,上诉两个接口函数插入数据前均需要移动原有数据,效率低下,不建议使用。

3.5.1 示例:
#include<iostream>
using namespace std;int main()
{string s1("hello wzy hello java!");cout << "orign staus:"<<s1 << endl;s1.insert(6, "n");cout << "After insert:"<<s1 << endl;s1.erase(6,1);cout << "After erase:" << s1 << endl;s1.erase(5);cout << "After erase:" << s1 << endl;return 0;
}

输出结果:

orign staus:hello wzy hello java!
After insert:hello nwzy hello java!
After erase:hello wzy hello java!
After erase:hello

 

3.5.2 相关链接
  • C++ string::insert() 文档
  • C++ string::erase() 文档
3.6 字符串与整数的转换

#include<iostream>
#include<string>
using namespace std;int main()
{int num = 20;string s1 = to_string(num);//将数值转换为字符串cout << s1 << endl;string s="123456";int sNum=stoi(s);//将字符串转换为整数cout << sNum << endl;string s3("123");float s4 = stof(s3);//将字符串转换为浮点数cout << s4 << endl;return 0;
}

 输出结果:

20
123456
123

3.6.2 相关链接
  • C++ to_string() 文档
  • C++ stoi()文档
  • stof - C++ Reference文档

最后

相信通过这篇文章你对C++STL->string的使用高级部分的有了初步的了解。如果此篇文章对你学习C++有帮助,期待你的三连,你的支持就是我创作的动力!!!

下一篇文章再会.

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

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

相关文章

基于SSM+微信小程序的家庭记账本管理系统(家庭1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 1、管理员端功能有首页、个人中心、用户管理&#xff0c;消费详情管理、收入详情管理、系统管理等。 2、用户端功能有首页、消费详情、收入详情、论坛信息、我的等功能。 2、项目技术 …

python机器人编程——用python调用API控制wifi小车的实例程序

目录 一、前言二、一个客户端的简单实现2.1 首先定义一个类及属性2.2 其次定义连接方法2.3 定义一些回调函数2.4 定义发送小车指令方法2.5 定义一个正常关闭方法 三、python编程控制小车的demo实现四、小结PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源p…

【保姆级教程】DolphinScheduler本地部署与远程访问详细步骤解析

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

【牛客刷题】笔记2

目录 1、单词搜索 2、岛屿数量 2.1 DFS 2.2 BFS 3、腐烂的橘子 1、单词搜索 单词搜索_牛客题霸_牛客网 (nowcoder.com) 这道题我们就是先遍历数组board&#xff0c;若遇到了与word[0]相等的字符&#xff0c;则以这个字符为起点进行搜索&#xff0c;搜索可以是dfs&#x…

#每日一题#自动化 2024年10月

#每日一题#自动化 2024年10月 1、深拷贝和浅拷贝的区别是什么&#xff1f; 参考答案&#xff1a; 深拷贝是将对象本身复制给另一个对象。这意味着如果对对象的副本进行更改时不会影响原对象。在 Python 中&#xff0c;我们使用 deepcopy&#xff08;&#xff09;函数进行深拷贝…

MyBatis-Plus(二):resultType 的选择——int 与 java.lang.Integer 的区别

resultType 的选择——int 与 java.lang.Integer 的区别 1、概述2、resultType介绍2.1、使用int2.2、使用java.lang.Integer 3、如何选择4、总结 大家好&#xff0c;我是欧阳方超&#xff0c;可以扫描下方二维码关注我的公众号“欧阳方超”&#xff0c;后续内容将在公众号首发。…

蘑菇分类识别数据集(猫脸码客 第222期)

蘑菇分类识别文本/图像数据集 蘑菇&#xff0c;作为一种广泛分布于全球的真菌&#xff0c;隶属于伞菌目伞菌亚门蘑菇科蘑菇属&#xff0c;拥有众多别名&#xff0c;如白蘑菇、洋蘑菇等。其不仅是世界上人工栽培最广泛、产量最高、消费量最大的食用菌品种之一&#xff0c;还在许…

Java程序设计:spring boot(8)——API ⽂档构建⼯具 - Swagger2

目录 1 环境整合配置 2 Swagger2 常⽤注解说明 2.1 Api 2.2 ApiOperation 2.3 ApiImplicitParams 2.4 ApiResponses 2.5 ApiModel 3 用户模块注解配置 3.1 Controller 使用注解 3.2 JavaBean 使用注解 4 Swagger2 接⼝⽂档访问 由于 Spring Boot 能够快速开发、便捷…

理解JVM

文章目录 前言一、JVM 内存区域划分二、JVM 中类加载的过程a.类加载的基本流程&#xff08;熟练背诵&#xff09;b.双亲委派模型 三、JVM 中的垃圾回收机制&#xff08;GC&#xff09;1.找到垃圾2.如何回收垃圾&#xff1f; 总结 前言 JVM 内部涉及到的内容是非常广泛的。咱们…

【Qt】Qt的介绍——Qt的概念、使用Qt Creator新建项目、运行Qt项目、纯代码方式、可视化操作、认识对象模型(对象树)

文章目录 Qt1. Qt的概念2. 使用Qt Creator新建项目3. 运行Qt项目3.1 纯代码方式实现3.2 可视化操作实现 4. 认识对象模型&#xff08;对象树&#xff09; Qt 1. Qt的概念 Qt 是一个跨平台的 C 图形用户界面应用程序开发框架。它是软件开发者提供的用于界面开发的程序框架&#…

PCC Net模型实现行人数量统计

关注底部公众号&#xff0c;回复暗号&#xff1a;13&#xff0c;免费获取600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 项目简介 PCC Net是一种用于拥挤场景下行人计数的深度学习模型。该项目的目标是利用神经网络&#xff0c;准确地统计给定区域内的行人数…

Visual Studio Code

代码自动保存 打开设置搜索auto save&#xff0c;设置为afterDelay 设置延迟时间&#xff0c;单位是毫秒 启用Ctrl鼠标滚轮对字体进行缩放 搜索Mouse Wheel Zoom&#xff0c;把该选项勾选上即可

Linux文件的查找和打包以及压缩

文件的查找 文件查找的用处&#xff0c;在我们需要文件但却又不知道文件在哪里的时候 文件查找存在着三种类型的查找 1、which或whereis&#xff1a;查找命令的程序文件位置 2、locate&#xff1a;也是一种文件查找&#xff0c;但是基于数据库的查找 3、find&#xff1a;针…

Artistic Oil Paint 艺术油画着色器插件

只需轻轻一点&#xff0c;即可将您的视频游戏转化为艺术品&#xff01;&#xff08;也许更多…&#xff09;。 ✓ 整个商店中最可配置的选项。 ✓ 六种先进算法。 ✓ 细节增强算法。 ✓ 完整的源代码&#xff08;脚本和着色器&#xff09;。 ✓ 包含在“艺术包”中。 &#x1f…

【学术论文投稿】自动化运维:解锁高效运维的密钥

【连续三届IEEE出版|EI检索】第三届图像处理、计算机视觉与机器学习国际学术会议&#xff08;ICICML 2024&#xff09;_艾思科蓝_学术一站式服务平台 更多学术会议请看&#xff1a;https://ais.cn/u/nuyAF3 目录 引言 一、自动化运维概述 1. 自动化运维的定义 2. 自动化运…

关于Docker

文章目录 DockerWSLWMWare虚拟机CentOS7安装dockerdocker基础命令docker数据卷挂载本地目录或文件 Docker Docker是一个快速构建、运行、管理应用的工具。 能够快速部署项目、项目依赖的组件、项目运行的环境。 项目传统的部署方式缺点&#xff1a; 各类环境、组件命令太多&…

科研进展 | RSE:全波形高光谱激光雷达数据Rclonte系列处理算法一

《环境遥感》&#xff08;Remote Sensing of Environment&#xff0c;IF11.1&#xff09;近日发表一项来自中国科学院空天信息创新研究院王力、牛铮研究员团队的全波形高光谱激光雷达&#xff08;hyperspectral LiDAR&#xff0c;HSL&#xff09;数据处理算法研究&#xff0c;论…

sentinel原理源码分析系列(八)-熔断

限流为了防止过度使用资源造成系统不稳&#xff0c;熔断是为了识别出”坏”资源&#xff0c;避免好的资源受牵连(雪崩效应)&#xff0c;是保证系统稳定性的关键&#xff0c;也是资源有效使用的关键&#xff0c;sentinel熔断插槽名称Degrade(降级)&#xff0c;本人觉得应该改为熔…

多级缓存-案例导入说明

为了演示多级缓存,我们先导入一个商品管理的案例,其中包含商品的CRUD功能。我们将来会给查询商品添加多级缓存。 1.安装MySQL 后期做数据同步需要用到MySQL的主从功能,所以需要大家在虚拟机中,利用Docker来运行一个MySQL容器。 1.1.准备目录 为了方便后期配置MySQL,我们…

docker sameersbn/bind dns服务器

1. 安装 #下载docker 镜像 docker pull sameersbn/bind#运行 53端口若被占用会启动失败 docker run --name dns -d --restartalways \ --publish 53:53/tcp \ --publish 53:53/udp \ --publish 10000:10000/tcp \ -v /etc/localtime:/etc/localtime \ -v /data/bind/:/data \…