当前位置: 首页 > news >正文

[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();


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

相关文章:

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

要相信别人能做出来自己一定可以做出来&#xff0c;只不过是时间没到而已 目录 &#x1f6a9;string类对象capacity操作 &#x1f4bb;reserve()保留 &#x1f4bb;resize() &#x1f6a9;string类对象元素访问操作 &#x1f4bb;operator[]和at() &#x1f4bb;operator…...

PHP 双门双向门禁控制板实时监控源码

本示例使用设备&#xff1a; 实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (taobao.com) <?PHPheader("content-type:text/html;charsetGBK");$ThisIpget_local_ip(); //获取电脑IP地址 $server udp://.$ThisIp.:39192; $sock…...

【源码解析】聊聊线程池 实现原理与源码深度解析(二)

AbstractExecutorService 上一篇文章中&#xff0c;主要介绍了AbstractExecutorService的线程执行的核心流程&#xff0c;execute() 这个方法显然是没有返回执行任务的结果&#xff0c;如果我们需要获取任务执行的结果&#xff0c;怎么办&#xff1f; Callable 就是一个可以获…...

本地Lambda(SAM LI)+ MySQL(Docker)环境构筑注意点

目录构成 mysql8 ├─data ├─logs └─docker├─docker-compose.yml├─.env├─config└─my.cnf .env DB_NAMEtest_db ROOT_DB_PASSroot_password DB_USERtest_user DB_PASStest_password DB_PORT3306 TZAsia/Tokyo docker-compose.yml version: "3.6" ser…...

Windows下打包C++程序无法执行:无法定位程序输入点于动态链接库

1、问题描述 环境&#xff1a;CLionCMakeMinGW64遇到问题&#xff1a;打包的exe无法运行&#xff0c;提示无法定位程序输入点于动态链接库。 2、解决思路 ​ 通过注释头文件的方式&#xff0c;初步定位问题是因为使用了#include <thread> 多线程库引起的。而且exe文件…...

Android 12 打开网络ADB并禁用USB连接ADB

平台 RK3588 Android 12 Android 调试桥 (adb) Android 调试桥 (adb) 是一种功能多样的命令行工具&#xff0c;可让您与设备进行通信。adb 命令可用于执行各种设备操作&#xff0c;例如安装和调试应用。adb 提供对 Unix shell&#xff08;可用来在设备上运行各种命令&am…...

基于Langchain的txt文本向量库搭建与检索

这里的源码主要来自于Langchain-ChatGLM中的向量库部分&#xff0c;做了一些代码上的修改和封装&#xff0c;以适用于基于问题和包含数据库表描述的txt文件&#xff08;文件名为库表名&#xff0c;文件内容为库表中的字段及描述&#xff09;对数据库表进行快速检索。 中文分词…...

vue2-router

1.基础 1.1.安装 npm install vue-router3.6.5 1.2.引入 import VueRouter from "vue-router" 1.3.注册 Vue.use(VueRouter) 1.4.创建 const router new VueRouter({routes: [{path:/page1, page1},{path:/page2, page2}]} ) 1.5.引用 new Vue({render: h >…...

css新闻链接案例

利用html和css构建出新闻链接案例&#xff0c;使用渐变色做出背景色变化 background: linear-gradient(to bottom, rgb(137, 210, 251), rgb(238, 248, 254), white); 利用背景图片&#xff0c;调整位置完成 dd { height: 28px; line-height: 28px; background-image: url(./图…...

Android wifi连接和获取IP分析

wifi 连接&获取IP 流程图 代码流程分析 一、关联阶段 1. WifiSettings.submit – > WifiManager WifiSettings 干的事情比较简单&#xff0c;当在dialog完成ssid 以及密码填充后&#xff0c;直接call WifiManager save 即可WifiManager 收到Save 之后&#xff0c;就开…...

MLIR笔记(5)

4.3.4. 图区域 在MLIR中&#xff0c;区域里类似图的语义由RegionKind::Graph来表示。对没有控制流的并发语义&#xff0c;以及通用有向图数据结构的建模&#xff0c;图区域是合适的。图区域适用于表示耦合值之间的循环关系&#xff0c;这些关系没有基本的序。例如&#xff0c;…...

abapgit 安装及使用

abapgit 需求 SA[ BASIS 版本 702 及以上 版本查看路径如下&#xff1a; 安装步骤如下&#xff1a; 1. 下载abapgit 独立版本 程序 链接如下&#xff1a;raw.githubusercontent.com/abapGit/build/main/zabapgit_standalone.prog.abap 2.安装开发版本 2.1 在线安装 前置条…...

园区无线覆盖方案(智慧园区综合解决方案)

​ 李经理正苦恼头疼的工业园区数字化改造项目。近年企业快速增长,园区内Argent工业设备激增,IT部门应接不暇。为确保生产系统稳定运行,IT管理团队经过反复摸索,决定进行全面的数字化升级。然而改造之艰巨远超想象——混杂的接入环境、复杂的专线部署、长达数月的建设周期,种种…...

配置中心--Spring Cloud Config

目录 概述 环境说明 步骤 创建远端git仓库 准备配置文件 配置中心--服务端 配置中心--客户端 配置中心的高可用 配置中心--服务端 配置中心--客户端 消息总线刷新配置 配置中心--服务端 配置中心--客户端 概述 因为微服务架构有很多个服务&#xff0c;手动一个一…...

笔记-模拟角频率和数字角频率的关系理解

先建议阅读前人此文&#xff08;点击这里&#xff09;&#xff0c;有助于理解。 模拟频率&#xff1a;f 模拟角频率&#xff1a;Ω 数字角频率&#xff1a;ω 其中&#xff1a;在模拟信号中Ω 2πf 正弦波表示&#xff1a;sin(2πft) sin(Ωt) 数字信号就是离散的&#xff…...

Zookeeper+Kafka集群

注&#xff1a;本章使用的Kafka为2.7.0版本 Zookeeper概述 1.Zookeeper定义 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 2.Zookeeper工作机制 Zookeeper从设计模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理…...

Sunshine+Moonlight+Android手机串流配置(局域网、无手柄)

目录 前言Sunshine&#xff08;服务端&#xff09;ApplicationConfigurationGeneralAdvance Moonlight&#xff08;客户端&#xff09;配对打开虚拟手柄串流按键调整退出串流 原神&#xff0c;启动&#xff01; 前言 写这篇文章单纯是因为搜来搜去没有很符合我需求的教程&#…...

从顺序表中删除具有最小值的元素(假设唯一) 并由函数返回被删元素的值。空出的位 置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。

题目描述&#xff1a;从顺序表中删除具有最小值的元素(假设唯一) 并由函数返回被删元素的值。空出的位置由最后一个元素填补&#xff0c;若顺序表为空&#xff0c;则显示出错信息并退出运行。 bool DeleteMin(SqList &L,int &min){if(L.length 0)return false;min L…...

详解—[C++ 数据结构]—AVL树

目录 一.AVL树的概念 二、AVL树节点的定义 三、AVL树的插入 3.1插入方法 四、AVL树的旋转 1. 新节点插入较高左子树的左侧---左左&#xff1a;右单旋 2. 新节点插入较高右子树的右侧---右右&#xff1a;左单旋 3.新节点插入较高左子树的右侧---左右&#xff1a;先左单旋…...

卷积神经网络(CNN):乳腺癌识别.ipynb

文章目录 一、前言一、设置GPU二、导入数据1. 导入数据2. 检查数据3. 配置数据集4. 数据可视化 三、构建模型四、编译五、训练模型六、评估模型1. Accuracy与Loss图2. 混淆矩阵3. 各项指标评估 一、前言 我的环境&#xff1a; 语言环境&#xff1a;Python3.6.5编译器&#xf…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...