【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.mzph.cn/news/882928.shtml

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

相关文章

【跨平台】ReactNative 入门初探

【跨平台】ReactNative 入门初探 环境搭建与资料基础知识JS/TS Html基础React 基础异步编程处理PromiseGeneratorasync UI 组件定义和使用style宽度和高度FlexBox触摸组件常用交互 Redux基础概念 与安卓通信参考相关类注解等 构建打包示例常用参数自定义RN插件 环境搭建与资料 …

no.977有序数组的平方 python

一、题目 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;平方后&#xff0c…

.NETCore Blazor使用localStorage存储登录信息

目录 1. JWT 登录并存储到 localStorage 2. 读取 JWT 3. 删除 JWT&#xff08;用户退出&#xff09; 4. 修改 JWT 5. 处理 JWT 过期 总结 在使用 JWT&#xff08;JSON Web Token&#xff09;进行身份验证时&#xff0c;除了生成和存储 JWT&#xff0c;还需要处理读取、删…

ApacheShiro反序列化 550 721漏洞

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理个漏洞被称为 Shiro550 是因为在Apache Shiro的GitHub问题跟踪器中&#xff0c;该漏洞最初被标记为第550个问题,721漏洞名称也是由此而来 Shiro-550 CVE-2016-4437 Shiro反序列化Docker复现 …

JavaScript 第30章:综合项目

看起来您想要了解如何在一个JavaScript为主的项目中进行项目规划、技术选型、开发流程以及维护等方面的内容&#xff0c;并且希望结合Java的源代码来进行详细的讲解。不过&#xff0c;JavaScript和Java是两种不同的编程语言&#xff0c;通常它们的应用场景也不同。JavaScript 主…

运动监测网站毕设基于SpringBootSSM框架的计算机毕业设计

目录 ‌一、引言 ‌ 1. 开发背景 2. 开发目标 ‌二、系统设计与实现‌ ‌技术选型‌&#xff1a; ‌功能模块‌&#xff1a; ‌技术挑战与解决方案‌&#xff1a; 4. 测试与评估‌ ‌三、需求分析 1.用户需求分析‌ 2. 功能需求‌ 3.非功能需求‌ ‌四、成果与展…

Android GPU Inspector分析帧数据快速入门

使用 谷歌官方工具Android GPU Inspector (AGI) 可以对Android 应用进行深入和全面的系统性能分析和帧性能分析 。AGI 是一个非常强大的分析工具&#xff0c;尤其是在需要诊断 GPU 性能问题和优化应用时&#xff0c;可以帮助你精准找到性能瓶颈。本文介绍如何使用该工具对帧数据…

HTTP Proxy环境下部署Microsoft Entra Connect和Health Agents

在企业环境中&#xff0c;时常需要通过使用HTTP Proxy访问Internet&#xff0c;在使用HTTP Proxy访问Internet的环境中部署Microsoft Entra Connect和Microsoft Entra Connect Health Agents可能会遇到一些额外的配置步骤&#xff0c;以便这些服务能够正常连接到Internet。 一…

Windows系统PyCharm右键运行.sh文件

在参考了Windows系统下pycharm运行.sh文件&#xff0c;执行shell命令_shell在pycharm-CSDN博客 和深度学习&#xff1a;PyCharm中运行Bash脚本_pycharm bash-CSDN博客 配置了右键执行.sh文件之后&#xff0c;发现在Windows的PyCharm中直接右键运行sh文件&#xff0c;存在如下…

git取消被跟踪的文件并忽略

起因是博主需要忽略python缓存.pyc文件&#xff0c;但是由于git已经跟踪过&#xff0c;所以需要重新取消跟踪&#xff0c;然后让.gitignore文件生效 1. 在 .gitignore 中忽略 .pyc 文件 首先&#xff0c;确保在 .gitignore 文件中添加了忽略 .pyc 文件的规则&#xff1a; # …

【MyBatis】MyBatis-config标签详解

目录 MyBatis配置文件标签详解configuration标签properties标签typeAliases标签environments标签environment标签transactionManager标签dataSource标签mappers标签 MyBatis配置文件标签详解 我们在使用MyBatis框架的时候需要一个配置文件——MyBatis-config.xml来告诉MyBatis…

gbn,sr和tcp的区别

这是关于三种不同协议&#xff08;GBN、SR、TCP&#xff09;处理传输时序和丢包的行为比较。我们可以分别填充并解释它们的处理机制&#xff1a; GBN&#xff08;Go-Back-N&#xff09;协议&#xff1a; 类型发送方的计时器保存的是啥接收方收到失序的分组怎么办超时的时候发…

Android按钮Button

Button是程序用于和用户进行交互的一个重要控件。Button也是继承自TextView&#xff0c;既可以显示文本&#xff0c;又可以显示图片&#xff0c;二者在UI上的区别主要是 Button 控件有个按钮外观&#xff0c;提示用户单击。 图1 Button示意图 Button最主要的功能是通过单击来执…

K折交叉验证代码实现——详细注释版

正常方法 #---------------------------------Torch Modules -------------------------------------------------------- from __future__ import print_function import numpy as np import pandas as pd import torch.nn as nn import math import torch.nn.functional as …

基于潜空间搜索的策略自适应组合优化(NeurIPS2023)(未完)

文章目录 Abstract1 Introduction2 Related work3 Methods3.1 预备知识3.2 COMPASS4 Experiments4.1 TSP、CVRP和JSSP的标准基准测试4.2 对泛化的鲁棒性:解决变异实例4.3 搜索策略分析5 ConclusionAbstract 组合优化是许多现实应用的基础,但设计高效算法以解决这些复杂的、通…

MongoDB Shell 基本命令(三)生成学生脚本信息和简单查询

一、生成学生信息脚本 利用该脚本可以生成任意个学生信息&#xff0c;包括学号、姓名、班级、年级、专业、课程名称、课程成绩等信息&#xff0c;此处生成2万名学生&#xff0c;学生所有信息都是给定范围后随机生成。 生成学生信息后&#xff0c;再来对学生信息进行简单查询。…

vue video播放m3u8监控视频

很关键的问题 vite创建的项目不需要import ‘videojs-contrib-hls’ 导入就报错 直接添加如下代码即可 html5: {vhs: {overrideNative: true},nativeVideoTracks: false,nativeAudioTracks: false,nativeTextTracks: false} 下面是完整组件示例 <template><div>…

Java学习教程,从入门到精通,Java 基本数据类型(7)

Java 基本数据类型 在Java中&#xff0c;基本数据类型是编程中最基础的构建块之一。Java提供了八种基本数据类型&#xff0c;分别是&#xff1a;byte、short、int、long、float、double、char 和 boolean。下面是每种数据类型的详细介绍&#xff0c;包括代码示例和注释。 1. …

关于武汉芯景科技有限公司的限流开关芯片XJ6241开发指南(兼容LTC4411)

一、芯片引脚介绍 1.芯片引脚 二、系统结构图 三、功能描述 1.CTL引脚控制VIN和VOUT的通断 2.CTL引脚控制STAT引脚的状态 3.输出电压高于输入电压加上–VRTO的值&#xff0c;芯片处于关断状态

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

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