当前位置: 首页 > news >正文

【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++有帮助,期待你的三连,你的支持就是我创作的动力!!!

下一篇文章再会.

相关文章:

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

CSDN 文章目录 前言 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&…...

ETLCloud搭配MySQL | 让关系型数据库更智能

在现代数据处理领域&#xff0c;ETL技术和云服务正迅速成为数据管理的核心。本文将探讨如何将 ETLCloud 与 MySQL 配合使用&#xff0c;将不同来源的表转移到另一张表中&#xff0c;以最大限度地提升关系型数据库的价值和性能。 一、前期准备 环境 首先确保MySQL源数据库能够…...

Java 开发——(上篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus

一、概述 记录时间 [2024-10-23] 本文是一个基于 Spring Boot 3 MybatisPlus 的项目实战开发&#xff0c;主要涵盖以下几个方面&#xff1a; 从零开始的项目创建IDEA 中开发环境的热部署Maven、Swagger3、MybatisPlus 等的配置路由映射知识静态资源访问文件上传功能实现拦截器…...

Psychophysiology:脑-心交互如何影响个体的情绪体验?

摘要 情绪的主观体验与对身体(例如心脏)活动变化的情境感知和评估相关。情绪唤醒增加与高频心率变异性(HF-HRV)降低、EEG顶枕区α功率降低以及心跳诱发电位(HEP)振幅较高有关。本研究使用沉浸式虚拟现实(VR)技术来研究与情绪唤醒相关的脑心相互作用&#xff0c;以实现自然而可…...

FunASR实时语音识别内网部署 | 无网络环境中的实时语音识别 | 实时语音识别

1. 在有网的电脑上面先下载下面内容 下载模型文件&#xff0c;可以到modelscope中下载 下载项目源码&#xff0c;可以到github中搜索funasr下载 配置环境&#xff0c;这里使用conda虚拟环境&#xff0c;创建并进入虚拟环境 conda create -n funasr python3.8 conda activate …...

【设计模式-状态模式】

状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许一个对象在内部状态改变时改变它的行为。换句话说&#xff0c;这种模式让对象在不同的状态下能够表现出不同的行为&#xff0c;而不需要修改对象的代码。状态模式通过将对象的行为与状态进行…...

【代码随想录Day50】图论Part02

岛屿数量 深搜 题目链接/文章讲解&#xff1a;代码随想录 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默认的内容页的上一页&下一页的调用代码是&#xff1a; 上一篇&#xff1a;[!--info.pre--] 下一篇&#xff1a;[!--info.next--] 但是实话实说&#xff0c;如果做个很普通的模版那足够用了&#xff0c;但是如果想个性化一点的话&#xff0c;比如加背景&#xff…...

(7)c++复合数据类型之数组

数组 数组就是可以存储一组相同类型的值&#xff0c;比如int a[10];就是一个存储10个int类型的数组。 数组初始化 数组初始化可以单个初始化&#xff0c;也是使用列表初始化&#xff0c;列表初始化可以全部&#xff0c;或者部分&#xff0c;如下案例&#xff1a; #include &…...

2.1 > Shell 是什么、如何更熟练的使用 Bash Shell

Shell 基础知识 Shell是计算机操作系统中的一个命令行解释器&#xff0c;由C语言编写&#xff0c;用于用户与操作系统之间进行交互。用户可以通过Shell输入命令&#xff0c;操作系统接收到这些命令后执行相应的操作。Shell一般还提供了编程语言的基本功能&#xff0c;允许用户…...

YOLO V3 网络构架解析

YOLO V3&#xff08;You Only Look Once version 3&#xff09;是由Joseph Redmon等人于2018年提出的一种基于深度学习的目标检测算法。它在速度和精度上相较于之前的版本有了显著提升&#xff0c;成为计算机视觉领域的一个重要里程碑。本文将详细解析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轻量化技术应用的推进&#xff0c;5G RedCap旨在提供低功耗、低成本、广覆盖等功能特点赋能电力智能化升级。特别适用于工业物联网、低空经济、车联网、消费电子和轻量级5G的需求。 5G RedCap工业路由器的特点 低功耗&#xff1a;5G RedCap工业路由器通过节能技术&#…...

029.浏览器自动化-抓取#document下的内容

一、iframe下的#document是什么 #document 是一个特殊的 HTML 元素&#xff0c;表示 <iframe> 元素内部的文档对象。当你在 HTML 页面中嵌入一个 <iframe> 元素时&#xff0c;浏览器会创建一个新的文档对象来表示 <iframe> 内部的内容。这 个文档对象就是 #…...

2024前端html5,css3面试题总汇

1.XML&#xff0c;HTML&#xff0c;XHTML区别⭐ XML&#xff1a;XML是一个可扩展标记语言&#xff0c;主要是用来存储&#xff0c;传输数据的&#xff0c;并非显示数据&#xff0c;可以用来标记数据&#xff0c;定义数据类型&#xff0c;允许用户对自己的标记语言进行定义&…...

css实现外层不换行,内层换行

css实现上图效果&#xff0c;内容A和B整体不换行&#xff0c;B内容中换行 <div className"description"> <div className"label">{formatMessage({id: description})}</Col> <divclassName"value"> &l…...

word取消自动单词首字母大写

情况说明&#xff1a;在word输入单词后首字母会自动变成大写 &#xff08;1&#xff09;点击菜单栏文件 &#xff08;2&#xff09;点击“更多”——>“选项” &#xff08;3&#xff09;点击“校对”——>“自动更正选项” &#xff08;4&#xff09;取消“句首字母大写…...

flex常用固定搭配

flex常用固定搭配 flex简写&#xff1a;flex-grow&#xff08;项目放大&#xff09;&#xff0c;flex-shrink &#xff08;项目缩小&#xff09;&#xff0c;flex-basis&#xff08;项目本身&#xff09; flex: 1; 全写&#xff1a;flex: 1 1 0%;内容自动放大或缩小占满剩余…...

Kafka、Kafka Streams、Drools、Redis 和分布式数据库的风控系统程序

由于实时风控系统难度较大&#xff0c;集成框架设计各个单位均有特点&#xff0c;快速建立一个通用性较强&#xff0c;学习、实施和使用成本较低的框架尤其重要。 提供一个简化的 Java 程序示例&#xff0c;演示如何将 Kafka 消息中间件、Kafka Streams 计算引擎、Drools 规则…...

C++在实际项目中的应用第一课:游戏开发中的C++

第五章&#xff1a;C在实际项目中的应用 第一课&#xff1a;游戏开发中的C 1. 游戏引擎架构的详细分析 游戏引擎是现代游戏开发的核心&#xff0c;负责处理图形渲染、物理计算、音频管理和用户输入等多项功能。以下是游戏引擎架构的各个主要组成部分及其详细分析。 1.1 渲染…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...

【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析

1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器&#xff08;TI&#xff09;推出的一款 汽车级同步降压转换器&#xff08;DC-DC开关稳压器&#xff09;&#xff0c;属于高性能电源管理芯片。核心特性包括&#xff1a; 输入电压范围&#xff1a;2.95V–6V&#xff0c;输…...

基于小程序老人监护管理系统源码数据库文档

摘 要 近年来&#xff0c;随着我国人口老龄化问题日益严重&#xff0c;独居和居住养老机构的的老年人数量越来越多。而随着老年人数量的逐步增长&#xff0c;随之而来的是日益突出的老年人问题&#xff0c;尤其是老年人的健康问题&#xff0c;尤其是老年人产生健康问题后&…...