[c++]—string类___深度学习string标准库成员函数与非成员函数

要相信别人能做出来自己一定可以做出来,只不过是时间没到而已

目录

🚩string类对象capacity操作

💻reserve()保留

 💻resize()

🚩string类对象元素访问操作

💻operator[]和at()

💻operator[]和at()函数有关越界访问 

 🚩string类对象修饰语操作

💻assign()

💻insert()

💻erase()

💻replace()

🎓replace()函数的应用

🚩string类字符串操作 

💻substr() 截取子字符串

💻find()函数

👉npos成员常量 

💻find()和substr()函数结合使用

💻rfind()函数 

🎓find()和rfind()的区别

🎓题目—字符串最后一个单词的长度

👉getline()

💻find_first_of()函数

💻find_last_of()函数 

🎓find_first_of()和find_last_of() 


我们接着上一章的学习。

🚩string类对象capacity操作

从上一章节介绍了,size()和length()记录的是string类对象的字符串长度, max_size()指的是string类容纳的最大长度,capacith指的是已分配存储的大小,clear表示清空string类对象。

这里只限定在vs环境下,不同的环境下的处理不同


💻reserve()保留

C++中的reserve函数被广泛用于容器类中,它的作用是预留一定量的内存空间来存储元素,以提高程序的效率。这个函数只影响容器的capacity(容量),而不改变该容器包含的元素个数。使用reserve函数可以避免频繁的动态内存分配和释放,减少内存碎片的产生,以提高代码的效率。


 💻resize()

c++中resize函数是c++标准库vector容器的一个成员函数,用于改变vector的大小。它可以使vector变大或变小,根据变化的大小,它可能会在vector的末尾添加新元素,或者从末尾删除元素。

第一个参数表示新的大小,第二个可选参数表示插入的新值(缺省为默认构造函数值,可以是一个默认值,也可以是一个可变参数模板包)。

这里给字符串长度设置成200,后面直接初始化成'\0',capacity肯定是大于200的。

第二个函数不仅开空间,而且 填值初始化为'x'。


再次调用resize()函数是不会改变capacity的值,因为你想想,开辟了200个字符的空间,然后只需要20的空间,剩下的180空间直接交给操作系统了,那这样造成了极大的浪费,一般我们都是拷贝那20空间给新的字符串,然后free那剩下的空间。而不是这样直接丢弃,编译器是不会允许你这样做的。所以capacity是不可改变的。

这里只限定在vs环境下,不同的环境下的处理不同,我们调用resize()函数至字符串长度为0,capacity也是不改变的。


🚩string类对象元素访问操作

💻operator[]和at

int main()
{string s1("chenle");s1.at(0)='z';cout << s1 << endl;s1[0] = 'z';cout << s1 << endl;return 0;
}


💻operator[]和at()函数有关越界访问 

int main()
{string s1("chenle");s1.at(0)='z';cout << s1 << endl;s1[0] = 'z';cout << s1 << endl;s1[15];s1.at(15);return 0;
}


at()函数越界抛异常 

 at()函数调用如果越界,那么会抛异常,用下面的格式就相对于调用operator[]函数相对温和一点的处理方式。

int main()
{try {string s1("hello world");s1.at(0) = 'x';cout << s1 << endl;//s1[15];  // 暴力处理s1.at(15); // 温和的错误处理}catch (const exception& e){cout << e.what() << endl;}return 0;
}


 🚩string类对象修饰语操作

前面一篇文章我们讲了上面三个函数operator+=(),append(),push_back()。

💻assign()

int main()
{string s1("chenle");s1 += ("xxxxxx");cout << s1 << endl;s1.assign("sssssss");cout << s1 << endl;return 0;
}


💻insert()


💻erase()

int main()
{string s1("chenle");//删除第五个字符后面的一长度的字符s1.erase(5, 1);cout << s1 << endl;return 0;
}


string s1("chenle");cout << s1 << endl;s1.erase(3);cout << s1 << endl;


int main()
{string s2("hello world");/*s2.erase(0, 1);cout << s2 << endl;*///利用迭代器,begin()函数,那么删除begin()所指的当前位置的字符s2.erase(s2.begin());//参数不是迭代器,是个数值,那么删除第三个元素后面的所有字符s2.erase(3);cout << s2 << endl;return 0;
}


💻replace()



🎓replace()函数的应用

int main()
{//将所有的空格都改成%20string s1("hello world hello bit");string s3;for (auto ch : s1){if (ch != ' '){s3 += ch;}else{s3 += "%20";}}s1 = s3;cout << s1 << endl;return 0;
}


🚩string类字符串操作 


💻substr() 截取子字符串

注意:这里需要创建一个新的string对象被子字符串初始化,因为截取字符串不改变原先的字符串。

int main()
{string s1("chenle zhangyaunfei");cout << s1 << endl;string s2;s2=s1.substr(7, 12);cout << s2 << endl;return 0;
}


💻find()函数


👉npos成员常量 

这里我需要介绍一下npos

  • npos可以表示string的结束位子,是string::type_size 类型的,也就是find()返回的类型。find函数在找不到指定值的情况下会返回string::npos

这里我需要打印出这段网址中的协议http。我们想要找到://,那么用string::npos,如果find函数找不到://,那么就返回string::npos。我们可以看到我们依次遍历找到了://,那么不返回string::npos,if判断为真,然后截取[0,pos1)字符串字段,然后打印出。

int main()
{string url = "https://legacy.cplusplus.com/reference/string/string/";// 协议pos1  域名protocol  资源名size_t pos1 = url.find("://");string protocol;if (pos1 != string::npos){protocol = url.substr(0, pos1);}cout << protocol << endl;return 0;
}


一个网址由三个部分组成,协议,域名,资源名组成,我们要分别打印出协议的部分,域名的部分,资源名的部分,该如何使用find(),substr()函数呢?


💻find()和substr()函数结合使用

int main()
{string url = "https://legacy.cplusplus.com/reference/string/string/";// 协议protocol  域名  资源名size_t pos1 = url.find("://");string protocol;if (pos1 != string::npos){protocol = url.substr(0, pos1);}cout << protocol << endl;string domain;//域名string uri;//资源名size_t pos2 = url.find('/', pos1 + 3);//从pos1+3位置开始找'/'if (pos2 != string::npos){domain = url.substr(pos1+3,pos2-(pos1+3));//从pos1+3的位置,截取(pos2-(pos1+3))的长度,读到遇到第一个'/'位置uri = url.substr(pos2 + 1);//直接从pos2+1位置后读到最后即可}cout << domain << endl;cout << uri << endl;return 0;
}


💻rfind()函数 

逆向查字符或字符串,若查找成功,则返回逆向查到的第一个字符下标或第一个字符串首字符的下标;若查找失败,无法返回正确的下标。逆向查到的第一个字符或第一个字符串也就是正向的最后一个。rfind()函数的返回值为无符号整数类型。(rfind从后向前逆向查,但匹配是正向匹配的,可以参考下面代码多理解。)

str.rfind(“fab”,4);//从下标为4开始逆向查找,正向匹配,结果找不到,返回npos。
str.find(“fab”);//如果没有第二个参数,默认从下标npos开始。npos定义为保证大于任何有效下标的值。结果为5。


🎓find()和rfind()的区别

#include<iostream>
using namespace std;
int main()
{string str="abcdefab";cout<<str.find('a')<<endl;//正向找到,返回有效下标0。cout<<str.find('h')<<endl;//正向找不到,返回npos。cout<<str.find("ab",1)<<endl;//正向找到并返回ab的首字母a下标6。cout<<str.find("ab")<<endl;//没有第二个参数,默认从0下标开始正向查找,结果为0。正向查找,正向匹配。cout<<str.find("ha")<<endl;//正向找不到,返回npos。cout<<str.rfind('b')<<endl;//逆向找到并返回b的下标7。cout<<str.rfind('h')<<endl;//逆向找不到,返回npos。cout<<str.rfind('a',100)<<endl;//从下标100逆向查找,找到并返回a下标6。如果没有第二个参数,默认从下标npos开始。npos定义为保证大于任何有效下标的值。//如果要设置rfind()的第二个参数,那么一般情况下大于等于len-1就可以。cout<<str.rfind("fab")<<endl;//逆向找到,结果为5。cout<<str.rfind("fab",4)<<endl;//逆向找不到,返回npos。cout<<str.rfind("fab",5)<<endl;//逆向可以找到,结果为5。rfind从后向前逆向查,但匹配是正向匹配的,可以参考这个代码多理解。return 0;
}
//有效的下标应该在0~len-1范围内。len=str.size();

🎓题目—字符串最后一个单词的长度

#include <iostream>
using namespace std;int main()
{string str1;// 不要使用cin>>line,因为会它遇到空格就结束了// while(cin>>line)while(getline(cin, str1)){size_t pos1=str1.rfind(' ');cout<<str1.size()-pos1-1<<endl;}return 0;
}

👉getline()

遇到这种情况我们用getline()这个非成员函数来进行操作

getline()函数读取一整行。


💻find_first_of()函数

int main()
{string str("Please, replace the vowels in this sentence by asterisks.");size_t found = str.find_first_of("abc");while (found != string::npos){str[found] = '*';//找到abc字符那么就改成*found = str.find_first_of("abc", found + 1);//继续从found后面一个字符开始找abc任意一个}cout << str << '\n';return 0;
}


💻find_last_of()函数 

🎓find_first_of()和find_last_of() 

  • 1、find_first_of()函数
  • 正向查找在原字符串中第一个与指定字符串(或字符)中的某个字符匹配的字符,返回它的位置。若查找失败,则返回npos。(npos定义为保证大于任何有效下标的值。)
  • 2、find_last_of()函数
  • 逆向查找在原字符串中最后一个与指定字符串(或字符)中的某个字符匹配的字符,返回它的位置。若查找失败,则返回npos。(npos定义为保证大于任何有效下标的值。)
#include<iostream>
using namespace std;
int main()
{string str="abcdefab";cout<<str.find_first_of('a')<<endl;//第二个参数为0,默认从下标为0开始查找。cout<<str.find_first_of("hce")<<endl;//待查串hce第一个出现在原串str中的字符是c,返回str中c的下标2,故结果为2。cout<<str.find_first_of("ab",1)<<endl;//从下标为1开始查,待查串ab第一个出现在原串str中的字符是b,返回b的下标,结果为1。cout<<str.find_first_of('h')<<endl;//原串没有待查字符h,故查不到,返回npos。cout<<str.find_first_of("hw")<<endl;//待查子串任一字符在原串中都找不到,故查不到,返回npos。cout<<str.find_last_of("wab")<<endl;//原串最后一个字符首先与待查子串的每一个字符一一比较,一旦有相同的就输出原串该字符的下标.。结果为b的下标7。cout<<str.find_last_of("wab",5)<<endl;//从原串中下标为5开始逆向查找,首先f与待查子串每一字符比较,若有相同的就输出该字符在原串的下标。//若一个都没有,就依次逆向比较,即e再与待查子串一一比较,直到原串的b与待查子串中的b相同,然后输出该b在原串的下标1。cout<<str.find_last_of("fab",5)<<endl;//输出f在原串的下标5。cout<<str.find_last_of("fab",7)<<endl;//输出b在原串的下标7。cout<<str.find_last_of("hwk")<<endl;//原串没有待查子串的任何字符,故返回npos。return 0;
}
//有效的下标应该在0~len-1范围内。len=str.size();


 要相信别人能做出来自己一定可以做出来,只不过是时间没到而已

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

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

相关文章

如何让嵌入式开发板使用主机的网络

配置网络 1.开发板配置 将开发板和主机用网线连接 安装 net-tools&#xff0c;使用 ifconfig 命令 或者使用 ip 命令 su root ip a 发现一个 eth0的网口 ip link set xxx up 有多个网口时可以用该命令启用某一个网口 vim /etc/netplan/00-installer-config.yaml写入以下…

HTML—列表、表格、表单

1、列表 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表 1.1 无序列表 作用&#xff1a;布局排列整齐的不需要规定顺序的区域 标签&#xff1a;ul 嵌套 li&#xff0c;ul 是无序列表&#xff0c;li 是列表条目 注意事项&#…

FPGA falsh相关知识总结

1.存储容量是128M/8 Mb16MB 2.有256个sector扇区*每个扇区64KB16MB 3.一页256Byte 4.页编程地址0256 5&#xff1a;在调试SPI时序的时候一定注意&#xff0c;miso和mosi两个管脚只要没发送数据就一定要悬空&#xff08;处于高组态&#xff09;&#xff0c;不然指令会通过两…

【双向链表的实现】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 1. 双向链表的结构 2. 双向链表的实现 2.1 头文件 ——双向链表的创建及功能函数的定义 2.2 源文件 ——双向链表的功能函数的实现 2.3 源文件 ——双向链表功能的…

Jmeter测试移动接口性能 —— 压测

一般的公司都想知道自己产品的性能瓶颈和以及提升性能&#xff0c;以期大流量来了还撑得住。其实性能测试很难&#xff0c;难点在你不知道性能要达到怎样的需求。难点在于你没有实际的环境场景给你测试&#xff0c;总不能给线上环境你测试吧&#xff1f; 难点在于找性能瓶颈&a…

kafka C++实现消费者

文章目录 1 Kafka 消费者的逻辑2 Kafka 的C API2.1 RdKafka::Conf2.2 RdKafka::Event2.3 RdKafka::EventCb2.4 RdKafka::TopicPartition2.5 RdKafka::RebalanceCb2.6 RdKafka::Message2.7 RdKafka::KafkaConsumer&#xff08;核心&#xff09; 3 Kafka 消费者客户端开发3.1 必要…

Linux操作系统虚拟机安装(图文详解)

目录 前言 Linux系统介绍 虚拟机安装 1.安装步骤 2.破解激活步骤 3.创建Linux系统虚拟机 虚拟机的相关设置 1.基础设置 2.语言设置为中文 前言 今天我们开始学习Linux操作系统的安装虚拟机以及相关的Linux的环境配置&#xff0c;后面我还会继续发布Linux系统的相关基…

手机电脑同步的时间管理工具

有不少上班族会发现自己有太多的工作要完成&#xff0c;并且在工作中往往会浪费很多时间在无关紧要的事情上&#xff0c;而不是专注于真正重要的任务&#xff0c;因此没有足够的时间来完成所有任务。在这种情况下&#xff0c;我们可以使用时间管理软件来帮助自己优先考虑重要的…

IIS post .html页面报 405错误

IIS是不允许本地文件默认post请求的&#xff0c;windows10系统下的IIS&#xff08;10.0版&#xff09;默认也是不能 post请求\*.html或\*.json文件的 1 需要配置一下&#xff0c;配置如下&#xff1a; 2 双击处理程序映射&#xff0c;添加托管处理程序&#xff1a; 3 请求路径 …

es6 语法 解构 拼接 扩展运算 数组降为 symbol 迭代器 生成器 定时器 map 映射 对象字面量 私有属性 构造函数继承

es6 语法 解构 拼接 扩展运算 数组降为 symbol 迭代器 生成器 定时器 map 映射 对象字面量 私有属性 构造函数继承 promise async await 解构 // 解构var character {name:Brucezzz,pseudonym:Bruce,metadata:{age:32,gender:male,airbags: "说两句啊",airconditio…

springboot+jsp+java人才招聘网站4f21r

本基于springboot的人才招聘网站主要满足3种类型用户的需求&#xff0c;这3种类型用户分别为求职者、企业和管理员&#xff0c;他们分别实现的功能如下。 &#xff08;1&#xff09;求职者进入网站后可查看职位信息、企业信息以及职位新闻等&#xff0c;注册登录后可实现申请职…

在MySQL中如何存储一个IPv4地址?

在MySQL如何存储IPv4地址&#xff1f;这个在秋招面试的过程中被问到过&#xff0c;没有答上来&#xff0c;今天猛地想起了这个问题&#xff0c;做一下复盘。 一个IPv4地址是由32位二进制来表示的&#xff0c;用点分十进制表示可以划分为4部分&#xff0c;每部分占8位&#xff…

云时空社会化商业 ERP 系统 service SQL 注入漏洞复现

0x01 产品简介 时空云社会化商业ERP&#xff08;简称时空云ERP&#xff09; &#xff0c;该产品采用JAVA语言和Oracle数据库&#xff0c; 融合用友软件的先进管理理念&#xff0c;汇集各医药企业特色管理需求&#xff0c;通过规范各个流通环节从而提高企业竞争力、降低人员成本…

『PyTorch学习笔记』分布式深度学习训练中的数据并行(DP/DDP) VS 模型并行

分布式深度学习训练中的数据并行(DP/DDP) VS 模型并行 文章目录 一. 介绍二. 并行数据加载2.1. 加载数据步骤2.2. PyTorch 1.0 中的数据加载器(Dataloader) 二. 数据并行2.1. DP(DataParallel)的基本原理2.1.1. 从流程上理解2.1.2. 从模式角度理解2.1.3. 从操作系统角度看2.1.…

11-22 SSM3

书城分页查询 使用mybatis分页插件&#xff1a; 请完成登陆注册 -> 跳转到首页 解决前端上架时间点击切换 以及侧边栏点击由背景颜色的改变 完成超链接的绑定点击时间 -> jquery $(document).ready(function() { // 初始化上架时间状态为 true&#xff08;上架&…

简明指南:使用Kotlin和Fuel库构建JD.com爬虫

概述 爬虫&#xff0c;作为一种自动化从网络上抓取数据的程序&#xff0c;广泛应用于数据分析、信息提取以及竞争对手监控等领域。不同的实现方式和编程语言都能构建出高效的爬虫工具。在本文中&#xff0c;我们将深入介绍如何充分利用Kotlin和Fuel库&#xff0c;构建一个简单…

道路病害检测数据集RDD2022的标签映射关系【参考自官网给出的label_map.pbtxt文件,附查看代码】

TOC 结论 Label ID: 1, Label Name: D00 Label ID: 2, Label Name: D10 Label ID: 3, Label Name: D20 Label ID: 4, Label Name: D40链接地址 https://github.com/sekilab/RoadDamageDetector/ 查看代码 # 打开 label_map.pbtxt 文件 def read_label_map(file_path):label…

【稳定检索|投稿优惠】2024年经济管理与安全科学国际学术会议(EMSSIC 2024)

2024年经济管理与安全科学国际学术会议(EMSSIC 2024) 2024 International Conference on Economic Management and Security Sciences(EMSSIC 2024) 一、【会议简介】 2024年经济管理与安全科学国际学术会议(EMSSIC 2024)&#xff0c;将于繁华的上海城召开。这次会议的主题是“…

C++17那些事开篇之类模版参数推导(CTAD)

C17那些事开篇之类模版参数推导(CTAD) 引入 大家好&#xff0c;我是光城&#xff0c;今天开始正式开篇C17的新特性了&#xff0c;期待不&#xff0c;欢迎留言区说出想要更新的特性呀&#xff5e; C模板元编程一直是C开发者们熟知的一项功能&#xff0c;无论是初学者还是高级开发…

【猜数字游戏】用wxPython实现:基本的游戏框架 + 简单的图形用户界面

【猜数字游戏】 写在最前面猜数字游戏 实现【猜数字游戏】安装wxPython全部代码代码解析1. 初始化界面2. 生成随机数3. 处理猜测4. 特殊功能5. 分数计算 游戏小程序呈现结语 写在最前面 看到了一个比较有意思的问题 https://ask.csdn.net/questions/8038039 猜数字游戏 在这…