C++STL之string类

                                        食用指南:本文在有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中找hahastring tmp = "haha";cout << str1.find(tmp) << endl;//5cout << str1.find(tmp, 10) << endl;//15//int find(const char* s, int pos = 0) const; //查找s第一次出现位置,从pos开始查找cout << str1.find("haha") << endl;//527str1.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;//1cout << str1.compare("lala") << endl;//‐1cout << 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 worldstr1.erase(5, 4);//删除字符串中hehecout << 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 strstring str3 = "hello str3";//不能直接将string 转换成 char * 必须借助string中的c_str方法完成//char *str4 = str3;//errchar* str4 = const_cast<char*> (str3.c_str());cout << str4 << endl;//"hello str3"}

          运行效果:


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

                                 

                                                                 给个三连再走嘛~      

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

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

相关文章

AI 绘画Stable Diffusion 研究(十三)SD数字人制作工具SadTlaker使用教程

免责声明: 本案例所用安装包免费提供&#xff0c;无任何盈利目的。 大家好&#xff0c;我是风雨无阻。 想必大家经常看到&#xff0c;无论是在产品营销还是品牌推广时&#xff0c;很多人经常以数字人的方式来为自己创造财富。而市面上的数字人收费都比较昂贵&#xff0c;少则几…

三自由度PUMA机器人非线性控制研究(Matlab代码、Simulink仿真实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

pandas数据分析40——读取 excel 合并单元格的表头

案例背景 真的很容易疯....上班的单位的表格都是不同的人做的&#xff0c;所以就会出现各种合并单元格的情况&#xff0c;要知道我们用pandas读取数据最怕合并单元格了&#xff0c;因为没规律...可能前几列没合并&#xff0c;后面几列又合并了....而且pandas对于索引很严格&am…

飞机打方块(四)游戏结束

一、游戏结束显示 1.新建节点 1.新建gameover节点 2.绑定canvas 3.新建gameover容器 4.新建文本节点 2.游戏结束逻辑 Barrier.ts update(dt: number) {//将自身生命值取整let num Math.floor(this.num);//在Label上显示this.num_lb.string num.toString();//获取GameCo…

Flink学习笔记(一)

流处理 批处理应用于有界数据流的处理&#xff0c;流处理则应用于无界数据流的处理。 有界数据流&#xff1a;输入数据有明确的开始和结束。 无界数据流&#xff1a;输入数据没有明确的开始和结束&#xff0c;或者说数据是无限的&#xff0c;数据通常会随着时间变化而更新。 在…

【SpringCloud】SpringCloudAlibaba官网资料

出现原因 Spring Cloud Netflix Projects Entering Maintenance Mode 官网 博客 https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md官网 https://spring.io/projects/spring-cloud-alibaba#overview英文 https://github.com/alibaba/spring-cloud-…

数模论文写作细节要求

目录 优秀论文必要条件 数学建模的基本思路 第一步&#xff1a;了解问题——查文献、找数据 第二步&#xff1a;阐述要解决什么问题、用什么方法 其余步骤&#xff1a;给出数学模型、计算求解、对比结果与真实情况、应用于现实问题。 使用某种数学方法的理由和依据 创…

【C语言进阶(4)】指针和数组笔试题

文章目录 Ⅰ 一维数组Ⅱ 字符数组题型 1题型 2题型 3 Ⅲ 二维数组 数组名的意义 sizeof(数组名)&#xff0c;这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小。&数组名&#xff0c;这里的数组名表示的是整个数组&#xff0c;取出的是整个数组的地址。除了上述…

和鲸 ModelWhale 与中科可控多款服务器完成适配认证,赋能中国云生态

当前世界正处于新一轮技术革命及传统产业数字化转型的关键期&#xff0c;云计算作为重要的技术底座&#xff0c;其产业发展与产业规模对我国数字经济的高质量运行有着不可取代的推动作用。而随着我国数字上云、企业上云加快进入常规化阶段&#xff0c;云计算承载的业务应用越来…

Python——列表(list)推导式

本文基于python3。 目录 1、Python推导式2、列表(list)推导式2.1、定义2.2、实际操作2.2.1、一个表达式&#xff0c;后面为一个 for 子句2.2.2、一个表达式&#xff0c;后面为一个 for 子句&#xff0c;然后&#xff0c;跟着if 子句。2.2.3、一个表达式&#xff0c;后面为一个…

Java虚拟机(JVM):引用计数算法

一、引言 我们学习了Java内存运行时区域的各个部分&#xff0c;其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生&#xff0c;随线程而灭。栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来就已知的…

Rancher使用cert-manager安装报错解决

报错&#xff1a; rancher-rke-01:~/rke/rancher-helm/rancher # helm install rancher rancher-stable/rancher --namespace cattle-system --set hostnamewww.rancher.local Error: INSTALLATION FAILED: Internal error occurred: failed calling webhook "webhook…

数据结构 - 线性表的定义和基本操作

一、定义 线性表是具有相同特性的数据元素的一个有限序列。 线性表&#xff1a; 由n(n≥0)个数据元素&#xff08;结点&#xff09;组成的有限序列。线性表中数据元素是一对一的关系&#xff0c;每个结点最多有一个直接前驱&#xff0c;和一个直接后继 二、线性表的基本操作 …

ORB-SLAM2学习笔记9之图像帧Frame

文章目录 0 引言1 Frame类1.1 构造和重载函数1.1.1 双目相机1.1.2 RGBD相机1.1.3 单目相机 1.2 成员函数1.2.1 特征点去畸变1.2.2 特征点网格分配1.2.3 双目匹配1.2.4 RGBD相机深度计算 1.3 成员变量 2 Frame类的用途 0 引言 ORB-SLAM2学习笔记7详细了解了System主类和多线程和…

伦敦金走势图行情值得关注

不知道大家是否了解过伦敦金这个投资品种&#xff0c;或者有否财经网站以及金融终端上看到过它的行情走势图。其实&#xff0c;伦敦金并不是一种实实在在的黄金&#xff0c;而是一种跟踪伦敦现货黄金市场价格走势的黄金保证金交易品种&#xff0c;它每天的行情走势变化&#xf…

Vue-9.集成(.editorconfig、.eslintrc.js、.prettierrc)

介绍 同时使用 .editorconfig、.prettierrc 和 .eslintrc.js 是很常见的做法&#xff0c;因为它们可以在不同层面上帮助确保代码的格式一致性和质量。这种组合可以在开发过程中提供全面的代码维护和质量保证。然而&#xff0c;这也可能增加一些复杂性&#xff0c;需要谨慎配置…

Matlab使用

Matlab使用 界面介绍 新建脚本&#xff1a;实际上就是新建一个新建后缀为.m的文件 新建编辑器&#xff1a;ctrlN 打开&#xff1a;打开最近文件&#xff0c;以找到最近写过的文件 点击路径&#xff0c;切换当前文件夹 预设&#xff1a;定制习惯用的界面 常见简单指令 ;…

【C++从0到王者】第二十二站:一文讲透多继承与菱形继承

文章目录 前言一、多继承二、菱形继承三、菱形虚拟继承四、菱形虚拟继承的底层原理五、菱形虚拟继承对于空间的优化六、多继承和菱形继承中的一些细节七、菱形继承在库里面的应用八、继承和组合九、继承总结 前言 在我们前面所说的继承其实在C中也叫做单继承 即一个子类只有一…

田间气象站的优势与应用

在农业生产中&#xff0c;田间气象站是重要的气象监测工具&#xff0c;它能够对农田间的气象信息进行实时监测和记录&#xff0c;为农民伯伯提供农业生产科学依据。 田间气象站是由多个传感器共同组成&#xff0c;能够收集各项气象参数&#xff0c;包括我们常见的风速、风向、…