C++STL之string类

news2024/10/7 6:39:42

                                        食用指南:本文在有C++基础的情况下食用更佳  

                                       🍀本文前置知识:C++基础

                                       ♈️今日夜电波:喜劇—星野源

                                                                1:06 ━━━━━━️💟──────── 3:51
                                                                    🔄   ◀️   ⏸   ▶️    ☰ 

                                      💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍 


目录

一、string 容器基本概念

二、string 容器常用操作(结构+ 🌰)

      🌹  1、string的构造 和 赋值

          string 构造函数

        string 基本赋值操作

        🍀2、string的字符的存取

        [ ]和at的区别

 

        🍁3、string 拼接操作

        🍂4、字符串的查找替换

        🍃5、string 比较操作

        🌷6、字符串提取

        🌸7、字符串的插入删除

        💮8、string 和C风格的字符串转换


一、string 容器基本概念

        C 风格字符串(以空字符结尾的字符数组)太过复杂难于掌握, 不适合大程序的开发, 所以 C++标准库定义了一种 string 类, 定义在头文件。

        String 和 c 风格字符串对比:
        Char*是一个指针, String 是一个类
        string 封装了 char, 管理这个字符串, 是一个 char 型的容器。
        String 封装了很多实用的成员方法
        查找 find, 拷贝 copy, 删除 delete 替换 replace, 插入 insert
        不用考虑内存释放和越界:

        string 管理 char*所分配的内存。 每一次 string 的复制, 取值都由 string 类负责维
护, 不用担心复制越界和取值越界等。 算法
 


二、string 容器常用操作(结构+ 🌰)

      🌹  1、string的构造 和 赋值

          string 构造函数

string();//创建一个空的字符串 例如: string str;
string(const string& str);//使用一个 string 对象初始化另一个 string 对象
string(const char* s);//使用字符串 s 初始化
string(int n, char c);//使用 n 个字符 c 初始化 v

        string 基本赋值操作

string& operator=(const char* s);//char*类型字符串 赋值给当前的字符串
string& operator=(const string &s);//把字符串 s 赋给当前的字符串
string& operator=(char c);//字符赋值给当前的字符串
string& assign(const char *s);//把字符串 s 赋给当前的字符串
string& assign(const char *s, int n);//把字符串 s 的前 n 个字符赋给当前的字符串
string& assign(const string &s);//把字符串 s 赋给当前字符串
string& assign(int n, char c);//用 n 个字符 c 赋给当前字符串
string& assign(const string &s, int start, int n);//将 s 从 start 开始 n 个字符赋值给字符串

        🌰


void test01()
 {
	 //string(const char* s);//使用字符串s初始化
	 string str1("hello string");
	 cout << str1 << endl;//"hello string"
	
	 //string(int n, char c);//使用n个字符c初始化
	 string str2(10, 'H');
	 cout << str2 << endl;//"HHHHHHHHHH"
	 string str3 = str2;
	 cout << str3 << endl;//"HHHHHHHHHH"
	
	 string str4;
	 //string& operator=(const string &s);//把字符串s赋给当前的字符串
	 str4 = str1;
	 cout << str4 << endl;//"hello string"
	
	 //string& operator=(const char* s);//char*类型字符串 赋值给当前的字符串
	 string str5;
	 str5 = "hello str5";
	 cout << str5 << endl;//"hello str5"
	
	 //string& operator=(char c);//字符赋值给当前的字符串
	 string str6;
	 str6 = 'H';
	 cout << str6 << endl;//"H"
	
	 //string& assign(const char *s);//把字符串s赋给当前的字符串
	 string str7;
	 str7.assign("hello str7");
	 cout << str7 << endl;//"hello str7"
	
	 //string& assign(const char *s, int n);//把字符串s的前n个字符赋给当前的字符串
	 string str8;
	 str8.assign("hello str8", 5);
	 cout << str8 << endl;//"hello"
	
	 //string& assign(const string &s);//把字符串s赋给当前字符串
	 string str9;
	 str9.assign(str8);
	 cout << str9 << endl;//"hello"
	
	 //string& assign(int n, char c);//用n个字符c赋给当前字符串
	 string str10;
	 str10.assign(10, 'W');
	 cout << str10 << endl;//"WWWWWWWWWW"
	
	 //string& assign(const string &s, int start, int n);//将s从start开始n个
	 string str11;
	 str11.assign("hehehahahaxixi", 4, 6);
	 cout << str11 << endl;//"hahaha"
	 }

        运行效果:


        🍀2、string的字符的存取

char& operator[](int n);//通过[]方式取字符
char& at(int n);//通过 at 方法获取字符

        🌰

void test02()
{
	string str1 = "hello string";
	cout << str1[1] << endl;//'e'
	cout << str1.at(1) << endl;//'e'

	str1[1] = 'E';
	cout << str1 << endl;//"hEllo string"
	str1.at(7) = 'T';
	cout << str1 << endl;//"hEllo sTring"
}

        运行效果:
     

        [ ]和at的区别

void test03()
{ //[]和at的区别
	string str1 = "hello string";
		 try
		 {
		 //str1[1000]='G';//越界 []不抛出异常
			 str1.at(1000) = 'G';//越界 at会抛出异常
		 }
	 catch (exception& e)
		 {
		 cout << "异常:" << e.what() << endl;
		 }
	 }


        🍁3、string 拼接操作

string& operator+=(const string& str);//重载+=操作符
string& operator+=(const char* str);//重载+=操作符
string& operator+=(const char c);//重载+=操作符
string& append(const char *s);//把字符串 s 连接到当前字符串结尾
string& append(const char *s, int n);//把字符串 s 的前 n 个字符连接到当前字符串结尾
string& append(const string &s);//同 operator+=()
string& append(const string &s, int pos, int n);//把字符串 s 中从 pos 开始
//的 n 个字符连接到当前字符串结尾
string& append(int n, char c);//在当前字符串结尾添加 n 个字符 c

        🌰

void test03()
 {
	 string str1 = "hello";
	 string str2 = " string";
	 //string& operator+=(const string& str);//重载+=操作符
	 str1 += str2;
	 cout << str1 << endl;//"hello string"
	
	 string str3 = "hello";
	 //string& operator+=(const char* str);//重载+=操作符
	 str3 += " string";
	 cout << str3 << endl;//"hello string"
	
	 string str4 = "hello";
	 //string& append(const char *s, int n);//把字符串s的前n个字符连接到当前字符串结尾
	 str4.append("hehehaha", 4);
	 cout << str4 << endl;//"hellohehe"

	 //string& append(const string &s, int pos, int n);//把字符串s中从pos开始的n个字符连接到当前字符串结尾
	 string str5 = "hello";
	 string str6 = "hehehahaha";
	 str5.append(str6, 4, 6);
	 cout << str6 << endl;//"hellohahaha"
	 }

       运行效果:


        🍂4、字符串的查找替换

int find(const string& str, int pos = 0) const; //查找 str 第一次出现位置,从 pos 开始查找
int find(const char* s, int pos = 0) const; //查找 s 第一次出现位置,从 pos开始查找
int find(const char* s, int pos, int n) const; //从 pos 位置查找 s 的前 n 个字符第一次位置
int find(const char c, int pos = 0) const; //查找字符 c 第一次出现位置
int rfind(const string& str, int pos = npos) const;//查找 str 最后一次位置,从 pos 开始查找
int rfind(const char* s, int pos = npos) const;//查找 s 最后一次出现位置,从pos 开始查找
int rfind(const char* s, int pos, int n) const;//从 pos 查找 s 的前 n 个字符最后一次位置
int rfind(const char c, int pos = 0) const; //查找字符 c 最后一次出现位置
string& replace(int pos, int n, const string& str); //替换从 pos 开始 n 个字符为字符串 str
string& replace(int pos, int n, const char* s); //替换从 pos 开始的 n 个字符为字符串 s

        🌰

void test04()
 {
	 //int find(const string& str, int pos = 0) const; //查找str第一次出现位置, 从pos开始查找
	 string str1 = "hehe:haha:xixi:haha:heihei";
	 //从str1中找haha
	 string tmp = "haha";
	 cout << str1.find(tmp) << endl;//5
	 cout << str1.find(tmp, 10) << endl;//15
	
	 //int find(const char* s, int pos = 0) const; //查找s第一次出现位置,从pos开始查找
	 cout << str1.find("haha") << endl;//527
	 str1.replace(5, 4, "###");
	 cout << str1 << endl;//"hehe:###:xixi:haha:heihei"
	
	 string str2 = "www.sex.117114.sex.person.77.com";
	 //需求:将字符串中的所有"sex"用***屏蔽
	 int ret = 0;
	 while ((ret = str2.find("sex")) < str2.size())
		 {
		 str2.replace(ret, strlen("sex"), "***");
		 }
	 cout << str2 << endl;
	 }

        运行效果:


        🍃5、string 比较操作

/*
compare 函数在>时返回 1, <时返回 -1, ==时返回 0。
比较区分大小写, 比较时参考字典顺序, 排越前面的越小。大写的 A 比小写的 a 小。
*/
int compare(const string &s) const;//与字符串 s 比较
int compare(const char *s) const;//与字符串 s 比较

        🌰

void test05()
 {
	 string str1 = "hehe";
	 string str2 = "haha"; 
	 cout << str1.compare(str2) << endl;//1
	 cout << str1.compare("lala") << endl;//‐1
	 cout << str1.compare("hehe") << endl;//0
	 }

        运行效果:


        🌷6、字符串提取

string substr(int pos = 0, int n = npos) const;//返回由 pos 开始的 n 个字符组成的字符串

        🌰

void test06()
 {
	 string str1 = "hehehe:ha:xixixi:lalala:heihei";
	 //cout<<str1.substr(5,4)<<endl;

		 //案例:将:分割的所有字符串提取出来
		 int pos = 0;
	
		 while (1)
		 {
		 int ret = str1.find(":", pos);
		 if (ret < 0)
			 {
			 string tmp = str1.substr(pos, str1.size()-pos);
			 cout << tmp << endl;
			 break;
			 }
		
			 string tmp = str1.substr(pos, ret-pos);
		 cout << tmp << endl;
		
			 pos = ret + 1;
		 }
	 }

        这里特别解释一下为啥当ret<0时作为退出条件,因为当find没找到是他会默认找到最后面,也就是一长串的1。通过二进制转换后发现最后的结果为-1!

          运行效果:


        🌸7、字符串的插入删除

string& insert(int pos, const char* s); //插入字符串
string& insert(int pos, const string& str); //插入字符串
string& insert(int pos, int n, char c);//在指定位置插入 n 个字符 c
string& erase(int pos, int n = npos);//删除从 Pos 开始的 n 个字符

         🌰

void test07()
 {
	 string str1 = "hello world"; 
	 str1.insert(5, "hehe");
	 cout << str1 << endl;//"hellohehe world
	
	 str1.erase(5, 4);//删除字符串中hehe
	 cout << str1 << endl;//"hello world"
	
	 //清空字符串 str1.size()得到字符串的总大小
	 str1.erase(0, str1.size());
	 cout << str1.size() << endl;//0
	 }

          运行效果:


        💮8、string 和C风格的字符串转换

        在 c++中存在一个从 const char 到 string 的隐式类型转换, 却不存在从一个 string
对象到 Cstring 的自动类型转换。 对于 string 类型的字符串, 可以通过 cstr()函数返回 string 对象对应的 C_string. 通常, 程序员在整个程序中应坚持使用 string 类对象, 直到必须将内容转化为 char 时才将其转换为 C_string。
        提示: 为了修改 string 字符串的内容, 下标操作符[]和 at 都会返回字符的引用。
但当字符串的内存被重新分配之后, 可能发生错误。

//string 转 char*
string str = "itcast";
const char* cstr = str.c_str();
//char* 转 string
char* s = "itcast";
string str(s);

        🌰

void test08()
 {
	 
	 char str2[] = "hello str";
	 
	//将char * 转成 string (直接完成)
	 string str1(str2);
	 cout << str1 << endl;//hello str
	 
	 string str3 = "hello str3";
	 //不能直接将string 转换成 char * 必须借助string中的c_str方法完成
	 //char *str4 = str3;//err
	 char* str4 = const_cast<char*> (str3.c_str());
	 cout << str4 << endl;//"hello str3"
	 }

          运行效果:


                感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!  

                                 

                                                                 给个三连再走嘛~      

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

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

相关文章

5G手机终端省电方案

5G终端带宽大、频率高&#xff0c;天线一般为4接收2发射&#xff0c;因此功耗比较高。 5G Power Saving技术为3GPP的一大主要课题&#xff0c;本文介绍几种5G省电技术。 CDRX&#xff08;Connected Discontinuous reception&#xff09;是让终端定期休眠不监听PDCCH。 WUS&a…

C语言学习系列-->看淡指针(3)

文章目录 一、字符指针变量二、数组指针变量2.1 概述2.2 数组指针初始化 三、二维数组传参本质四、函数指针五、typedef关键字六、函数指针数组 一、字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* 一般使用&#xff1a; #include<stdio.h>int main…

【COMP282 LEC6 LEC7 LEC8】

LEC 6 Example container: Map Things are stored in ascending order (based on <) by default on the first component (the string) Map access 让一个键名为“one”的值为1 添加一个键值对&#xff0c;键名是“two”&#xff0c;值为2 functor 功能原件 LEC 7

2023企业Hyper-V备份解决方案!

虚拟技术已成为IT基础设施的核心元素&#xff0c;企业长期依赖虚拟机&#xff08;VM&#xff09;为应用程序提供工作负载。Hyper-V是一款广受欢迎的虚拟化平台&#xff0c;多年来已日臻完善&#xff0c;并在各类规模的公司中得到广泛应用。 随着虚拟机使用的普及&…

【0基础入门Python Web笔记】三、python 之函数以及常用内置函数

三、python 之函数以及常用内置函数 函数函数定义函数调用函数参数返回值 常用内置函数input()函数range()函数其它 更多实战项目可进入下方官网 函数 函数是一种用于封装可重复使用代码块的工具&#xff0c;能够将一系列操作组织成一个逻辑单元。 函数定义 在Python中&…

Linux_11_系统启动和内核管理

目录 1 C entOS 6 的启动管理1.1 Linux 组成1.2 内核设计流派1.3 CentOS 6启动流程1.3.1 CentOs 6 启动流程1.3.1 硬件启动POST1.3.2 bootloader 启动/引导加载器1.3.2.1 grub 功能和组成1.3.2.2 CentOS 6 grub 安装1.3.2.3 grub legacy 管理 1.3.3 加载 kernel1.3.4 init 初始…

循环购模式:打破传统消费模式,让每一次购物成为可持续性的循环

品牌做私域运营&#xff0c;只会不断促销是没有用的&#xff0c;反而会让用户渐渐无感。更高级的私域运营玩法应该是通过场景策略来做私域&#xff0c;直击用户的痛点&#xff0c;让用户自我说服&#xff0c;提高转化率。 循环购消费模式是一种创新的商业模式&#xff0c;它能…

PostgreSQL-研究学习-介绍与安装

PostgreSQL-预研 是个很厉害的数据库的样子 ψ(*&#xff40;ー)ψ 官方文档&#xff1a;http://www.postgres.cn/docs/12/ 总的结论和备注 PgSQL 支持对JSON的支持很强大&#xff0c;以及提供了很多数学几何相关的数据类型【例&#xff1a;点&#xff0c;线条&#xff0c;几何…

[PyTorch][chapter 51][Auto-Encoder -1]

目录&#xff1a; 简介 损失函数 自动编码器的类型 一 AutoEncoder 简介&#xff1a; 自动编码器是一种神经网络&#xff0c;用于无监督学习任务.(没有标签或标记数据), 例如降维,特征提取和数据压缩. 主要任务&#xff1a; 1&#xff1a; 输入数据 …

怎样做好日志分析?

首先我们要知道日志分析是指检查并理解计算机生成的日志消息&#xff0c;例如日志事件或审计来跟踪记录&#xff0c;通过日志分析可以帮助您诊断和解决计算机系统中的问题&#xff0c;以及监视系统性能和安全性。 如果您想知道您的网络中发生了什么&#xff0c;以便洞察潜在的…

线性代数的学习和整理10:各种特殊类型的矩阵(草稿-----未完成 建设ing)

非特殊矩阵 矩阵的类型 第2大类 图形化分类 8 对角线矩阵 三角矩阵 上三角矩阵 对称矩阵 零矩阵 梯形矩阵 下面的分类&#xff0c;功能性分类 增广矩阵 伴随矩阵 正交矩阵

17.1.2 【Linux】systemd使用的unit分类

systemd 有什么好处&#xff1f; 平行处理所有服务&#xff0c;加速开机流程&#xff1a; 旧的 init 启动脚本是“一项一项任务依序启动”的模式&#xff0c;因此不相依的服务也是得要一个一个的等待。但目前我们的硬件主机系统与操作系统几乎都支持多核心架构了&#xff0c;s…

OpenGL —— 2.1、绘制第一个三角形(附源码,glfw+glad)

源码效果 C源码 vertexShader.glsl #version 330 corelayout(location 0) in vec3 aPos; void main() {gl_Position vec4(aPos.x, aPos.y, aPos.z, 1.0); };fragmentShader.glsl #version 330 coreout vec4 FragColor; void main() {FragColor vec4(1.0f, 1.0f, 1.0f, 1.0…

基于transformer预测双色球(代码+数据+一键可运行)

对AI炒股感兴趣的小伙伴可加WX群&#xff1a; 1、引言 在这期内容中&#xff0c;我们将暂时将股票搁置一旁&#xff0c;转而探索人工智能技术如何应用于另一个有趣的领域&#xff1a;预测未来双色球号码。 2、AI与双色球预测的关系 在彩票预测中&#xff0c;AI充当着数据分析…

QRadioButton

QRadioButton API使用方式 QRadioButton是Qt提供的单选按钮, 一般都是以组的方式来使用(多个按钮中同时只能选中其中一个) 如果单选按钮被选中, 再次点击这个按钮选中状态是不能被取消的 API // 构造函数 /* 参数:- text: 按钮上显示的标题- parent: 按钮的父对象 */ QRadio…

SpringBoot3.x原生镜像-Native Image实践

前提 之前曾经写过一篇《SpringBoot3.x 原生镜像-Native Image 尝鲜》&#xff0c;当时SpringBoot处于3.0.0-M5版本&#xff0c;功能尚未稳定。这次会基于SpringBoot当前最新的稳定版本3.1.2详细分析Native Image的实践过程。系统或者软件版本清单如下&#xff1a; 组件版本备注…

【已解决】Linux中启动docker 出现 ‘ Failed to start docker.service: Unit not found. ’ 错误

启动docker 出现 ‘ Failed to start docker.service: Unit not found. ’ 错误 这是因为缺少 rhel-push-plugin.socket 单元&#xff0c;该单元是rhel-push-plugin软件包的一部分。所以我们执行以下指令就可以成功解决&#xff1a; curl -sSL https://get.docker.com/ | sh 执…

学习平台助力职场发展与提升

近年来&#xff0c;随着互联网技术的发展&#xff0c;学习平台逐渐成为了职场发展和提升的必备工具。学习平台通过提供丰富的课程内容、灵活的学习时间和个性化的学习路径&#xff0c;帮助职场人士更好地提升自己的技能和知识储备&#xff0c;为职场发展打下坚实的基础。 学习…

mysql 8.0 窗口函数 之 分布函数 与 sql server (2017以后支持) 分布函数 一样

mysql 分布函数 percent_rank&#xff08;&#xff09; &#xff1a;等级值 百分比cume_dist() &#xff1a;累积分布值 percent_rank&#xff08;&#xff09; 计算方式 (rank-1)/(rows-1)&#xff0c; 其中 rank 的值为使用RANK()函数产生的序号&#xff0c;rows 的值为当前…

并查集及其简单应用

文章目录 一.并查集二.并查集的实现三.并查集的基本应用 一.并查集 并查集的逻辑结构:由多颗不相连通的多叉树构成的森林(一个这样的多叉树就是森林的一个连通分量) 并查集的元素(树节点)用0~9的整数表示,并查集可以表示如下: 并查集的物理存储结构:并查集一般采用顺序结构实…