当前位置: 首页 > 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 渲染…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...