[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标准库成员函数与非成员函数
要相信别人能做出来自己一定可以做出来,只不过是时间没到而已 目录 🚩string类对象capacity操作 💻reserve()保留 💻resize() 🚩string类对象元素访问操作 💻operator[]和at() 💻operator…...

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

【源码解析】聊聊线程池 实现原理与源码深度解析(二)
AbstractExecutorService 上一篇文章中,主要介绍了AbstractExecutorService的线程执行的核心流程,execute() 这个方法显然是没有返回执行任务的结果,如果我们需要获取任务执行的结果,怎么办? 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、问题描述 环境:CLionCMakeMinGW64遇到问题:打包的exe无法运行,提示无法定位程序输入点于动态链接库。 2、解决思路 通过注释头文件的方式,初步定位问题是因为使用了#include <thread> 多线程库引起的。而且exe文件…...

Android 12 打开网络ADB并禁用USB连接ADB
平台 RK3588 Android 12 Android 调试桥 (adb) Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作,例如安装和调试应用。adb 提供对 Unix shell(可用来在设备上运行各种命令&am…...
基于Langchain的txt文本向量库搭建与检索
这里的源码主要来自于Langchain-ChatGLM中的向量库部分,做了一些代码上的修改和封装,以适用于基于问题和包含数据库表描述的txt文件(文件名为库表名,文件内容为库表中的字段及描述)对数据库表进行快速检索。 中文分词…...
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构建出新闻链接案例,使用渐变色做出背景色变化 background: linear-gradient(to bottom, rgb(137, 210, 251), rgb(238, 248, 254), white); 利用背景图片,调整位置完成 dd { height: 28px; line-height: 28px; background-image: url(./图…...

Android wifi连接和获取IP分析
wifi 连接&获取IP 流程图 代码流程分析 一、关联阶段 1. WifiSettings.submit – > WifiManager WifiSettings 干的事情比较简单,当在dialog完成ssid 以及密码填充后,直接call WifiManager save 即可WifiManager 收到Save 之后,就开…...
MLIR笔记(5)
4.3.4. 图区域 在MLIR中,区域里类似图的语义由RegionKind::Graph来表示。对没有控制流的并发语义,以及通用有向图数据结构的建模,图区域是合适的。图区域适用于表示耦合值之间的循环关系,这些关系没有基本的序。例如,…...

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

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

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

笔记-模拟角频率和数字角频率的关系理解
先建议阅读前人此文(点击这里),有助于理解。 模拟频率:f 模拟角频率:Ω 数字角频率:ω 其中:在模拟信号中Ω 2πf 正弦波表示:sin(2πft) sin(Ωt) 数字信号就是离散的ÿ…...

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

Sunshine+Moonlight+Android手机串流配置(局域网、无手柄)
目录 前言Sunshine(服务端)ApplicationConfigurationGeneralAdvance Moonlight(客户端)配对打开虚拟手柄串流按键调整退出串流 原神,启动! 前言 写这篇文章单纯是因为搜来搜去没有很符合我需求的教程&#…...
从顺序表中删除具有最小值的元素(假设唯一) 并由函数返回被删元素的值。空出的位 置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。
题目描述:从顺序表中删除具有最小值的元素(假设唯一) 并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。 bool DeleteMin(SqList &L,int &min){if(L.length 0)return false;min L…...

详解—[C++ 数据结构]—AVL树
目录 一.AVL树的概念 二、AVL树节点的定义 三、AVL树的插入 3.1插入方法 四、AVL树的旋转 1. 新节点插入较高左子树的左侧---左左:右单旋 2. 新节点插入较高右子树的右侧---右右:左单旋 3.新节点插入较高左子树的右侧---左右:先左单旋…...

卷积神经网络(CNN):乳腺癌识别.ipynb
文章目录 一、前言一、设置GPU二、导入数据1. 导入数据2. 检查数据3. 配置数据集4. 数据可视化 三、构建模型四、编译五、训练模型六、评估模型1. Accuracy与Loss图2. 混淆矩阵3. 各项指标评估 一、前言 我的环境: 语言环境:Python3.6.5编译器…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...