【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. size和capacity都不包括’\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++有帮助,期待你的三连,你的支持就是我创作的动力!!!
下一篇文章再会.
相关文章:
【C++篇】探索STL之美:熟悉使用String类
CSDN 文章目录 前言 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗&…...
ETLCloud搭配MySQL | 让关系型数据库更智能
在现代数据处理领域,ETL技术和云服务正迅速成为数据管理的核心。本文将探讨如何将 ETLCloud 与 MySQL 配合使用,将不同来源的表转移到另一张表中,以最大限度地提升关系型数据库的价值和性能。 一、前期准备 环境 首先确保MySQL源数据库能够…...
Java 开发——(上篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus
一、概述 记录时间 [2024-10-23] 本文是一个基于 Spring Boot 3 MybatisPlus 的项目实战开发,主要涵盖以下几个方面: 从零开始的项目创建IDEA 中开发环境的热部署Maven、Swagger3、MybatisPlus 等的配置路由映射知识静态资源访问文件上传功能实现拦截器…...
Psychophysiology:脑-心交互如何影响个体的情绪体验?
摘要 情绪的主观体验与对身体(例如心脏)活动变化的情境感知和评估相关。情绪唤醒增加与高频心率变异性(HF-HRV)降低、EEG顶枕区α功率降低以及心跳诱发电位(HEP)振幅较高有关。本研究使用沉浸式虚拟现实(VR)技术来研究与情绪唤醒相关的脑心相互作用,以实现自然而可…...
FunASR实时语音识别内网部署 | 无网络环境中的实时语音识别 | 实时语音识别
1. 在有网的电脑上面先下载下面内容 下载模型文件,可以到modelscope中下载 下载项目源码,可以到github中搜索funasr下载 配置环境,这里使用conda虚拟环境,创建并进入虚拟环境 conda create -n funasr python3.8 conda activate …...
【设计模式-状态模式】
状态模式(State Pattern)是一种行为设计模式,它允许一个对象在内部状态改变时改变它的行为。换句话说,这种模式让对象在不同的状态下能够表现出不同的行为,而不需要修改对象的代码。状态模式通过将对象的行为与状态进行…...
【代码随想录Day50】图论Part02
岛屿数量 深搜 题目链接/文章讲解:代码随想录 class Solution {// 计算网格中岛屿的数量public int numIslands(char[][] grid) {int sum 0; // 初始化岛屿数量为0// 遍历整个网格for (int i 0; i < grid.length; i) {for (int j 0; j < grid[0].length…...
帝国CMS 内容页调用上一篇下一篇的方法(精华汇总)
帝国cms默认的内容页的上一页&下一页的调用代码是: 上一篇:[!--info.pre--] 下一篇:[!--info.next--] 但是实话实说,如果做个很普通的模版那足够用了,但是如果想个性化一点的话,比如加背景ÿ…...
(7)c++复合数据类型之数组
数组 数组就是可以存储一组相同类型的值,比如int a[10];就是一个存储10个int类型的数组。 数组初始化 数组初始化可以单个初始化,也是使用列表初始化,列表初始化可以全部,或者部分,如下案例: #include &…...
2.1 > Shell 是什么、如何更熟练的使用 Bash Shell
Shell 基础知识 Shell是计算机操作系统中的一个命令行解释器,由C语言编写,用于用户与操作系统之间进行交互。用户可以通过Shell输入命令,操作系统接收到这些命令后执行相应的操作。Shell一般还提供了编程语言的基本功能,允许用户…...
YOLO V3 网络构架解析
YOLO V3(You Only Look Once version 3)是由Joseph Redmon等人于2018年提出的一种基于深度学习的目标检测算法。它在速度和精度上相较于之前的版本有了显著提升,成为计算机视觉领域的一个重要里程碑。本文将详细解析YOLO V3的网络架构&#x…...
【zlm】 webrtc源码讲解(二)
目录 webrtc播放 MultiMediaSourceMuxer里的_ring webrtc播放 > MediaServer.exe!mediakit::WebRtcPlayer::onStartWebRTC() 行 60 CMediaServer.exe!mediakit::WebRtcTransport::OnDtlsTransportConnected(const RTC::DtlsTransport * dtlsTransport, RTC::SrtpSession::…...
5G RedCap工业路由器赋能电力物联网应用
随着5G轻量化技术应用的推进,5G RedCap旨在提供低功耗、低成本、广覆盖等功能特点赋能电力智能化升级。特别适用于工业物联网、低空经济、车联网、消费电子和轻量级5G的需求。 5G RedCap工业路由器的特点 低功耗:5G RedCap工业路由器通过节能技术&#…...
029.浏览器自动化-抓取#document下的内容
一、iframe下的#document是什么 #document 是一个特殊的 HTML 元素,表示 <iframe> 元素内部的文档对象。当你在 HTML 页面中嵌入一个 <iframe> 元素时,浏览器会创建一个新的文档对象来表示 <iframe> 内部的内容。这 个文档对象就是 #…...
2024前端html5,css3面试题总汇
1.XML,HTML,XHTML区别⭐ XML:XML是一个可扩展标记语言,主要是用来存储,传输数据的,并非显示数据,可以用来标记数据,定义数据类型,允许用户对自己的标记语言进行定义&…...
css实现外层不换行,内层换行
css实现上图效果,内容A和B整体不换行,B内容中换行 <div className"description"> <div className"label">{formatMessage({id: description})}</Col> <divclassName"value"> &l…...
word取消自动单词首字母大写
情况说明:在word输入单词后首字母会自动变成大写 (1)点击菜单栏文件 (2)点击“更多”——>“选项” (3)点击“校对”——>“自动更正选项” (4)取消“句首字母大写…...
flex常用固定搭配
flex常用固定搭配 flex简写:flex-grow(项目放大),flex-shrink (项目缩小),flex-basis(项目本身) flex: 1; 全写:flex: 1 1 0%;内容自动放大或缩小占满剩余…...
Kafka、Kafka Streams、Drools、Redis 和分布式数据库的风控系统程序
由于实时风控系统难度较大,集成框架设计各个单位均有特点,快速建立一个通用性较强,学习、实施和使用成本较低的框架尤其重要。 提供一个简化的 Java 程序示例,演示如何将 Kafka 消息中间件、Kafka Streams 计算引擎、Drools 规则…...
C++在实际项目中的应用第一课:游戏开发中的C++
第五章:C在实际项目中的应用 第一课:游戏开发中的C 1. 游戏引擎架构的详细分析 游戏引擎是现代游戏开发的核心,负责处理图形渲染、物理计算、音频管理和用户输入等多项功能。以下是游戏引擎架构的各个主要组成部分及其详细分析。 1.1 渲染…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
