C++学习---string模拟实现(2)

1.随机插入一个字符串

(1)insert函数插入一个字符的方法我们在之前的模拟实现里面已经搞过了,那个里面要注意的是这个全体向后挪动的循环过程,这个里面我们要实现的是插入字符串的模拟实现;

(2)这个插入字符串还是需要注意这个在头部进行插入的情况,我们的这个解决方案和插入一个字符是相通的,就是把这个end的类型改为这个int类型,pos也是可以强制类型转换为int类型的,这样的话就可以在这个头部进行数据的插入了;

(3)上面的案例里面所使用到的strncpy函数的参数有3个,第一个参数的意思是destination,也就是目的地的意思,第二个参数的意思是source也就是源头的意思,第三个参数的意义就是拷贝字符的个数,这个里面的话就是拷贝len个字符,把str从_str+pos的位置开始拷贝;

2.随机删除一个字符串

(1)删除字符串使用的同样是erase函数, 这个函数里面是有两个参数的,第一个参数就是我们想要开始删除的位置,第二个参数就是这个想要删除的个数,但是在这个函数参数部分,我们也是给出了这个缺省值npos,这个就是一个很大的数值;

(2)如果我们在传参的时候只给了一个参数,就是这个pos,也就是开始进行删除的位置,这个时候编译器会默认为这个第二个参数就是npos,也就是这个无穷大,所以这个时候进行删除的话就会从我们指定的pos位置开始一直删除到这个最后末尾;

(3)如果我们指定这个删除的字符串的长度的话,就会从这个pos位置开始,删除len个之后就停止了,我们的方法就是使用的if  else语句,如果这个pos后面只有4个字符,但是你要删除的字符的个数大于6个的话,就会全部删除,这样的话我们可以直接在这个pos下标的位置补上斜杠0就可以

但是如果我们只是删除部分字符的话,我们还是要进行这个字符的挪动的,循环的条件是begin<=_size这样的话,相当于是从这个pos+len也就是begin的位置开始向前进行这个挪动知道begin>_size这个过程里面斜杠0也会直接被挪过去,例如这个hello一共是5字符,下标就是01234,我们从下标是2的位置开始删除,删除两个,这样的话就会上下这个o字符,begin就是4下标,这个下标位置就是o,相当于是4下标<=5(这个5指的是字符的个数),所以可以把这个o字符挪过去,begin++就是5下标,这个位置就是斜杠0,再把这个斜杠0挪过去循环才会结束;

(4)我们也是可以改变这个循环条件不去管这个斜杠0,最后再把这个斜杠0添加到这个新的字符串的后面也是可以的,最后我们要修改更新这个_size大小,新的大小就是减去这个len个数的字符

(5)下面的就是我们的测试案例:第一次的erase是从3下标开始,删除4个字符,第二次这个删除100个肯定是不可能的,但是这个时候编译器不会报错,而是删掉pos位置后面的全部字符,第三次的这个只传递了一个参数就会默认删掉pos位置后面的全部字符;

3.resize函数的模拟实现

(1)我们的这个resize函数的总用就是可以缩小这个字符串的容量,也可以增加这个字符串的容量,具体的模拟实现如下所示:

(2)这个模拟实现我们给了2个参数,第一个就是这个容量的大小,第二个就是在这个扩容的情况下面需要拿什么字符进行填充,如果这个n<_size的话,就是相当于缩小这个空间,直接添加这个斜杠0就可以了,否则的话我们需要使用这个reserve函数进行扩容,然后填充这个字符;

如果给了这个字符,我们就按照这个传递的字符进行填充,否则就按照这个默认的斜杠0进行填充,因为这个填充的字符不一定是斜杠0,所以我们最后还是要在这个字符串的末尾加上斜杠0;

(3)下面是对于这个函数模拟实现的测试用例,第一个传递参数3就相当于是缩小空间,只会保留3个字符,第二次测试的20相当于是扩容到20字节大小的空间,而且是使用x字符进行填充的;

(4)其实这个reserve函数我们之前也是模拟实现过的,就是开辟空间temp把原来的数组给拷贝过去,删掉原来的空间,最后更新这个_capacity容量的大小,这个函数的模拟实现相当于是使用的动态内存的开辟和释放;

4.find函数的模拟实现

(1)首先就这个函数查找到这个单个的字符,返回的就是这个字符的下标,这个就是一个for循环,一个if循环判断就可以了;

(2)然后是查找到这个字符串,这个传递的参数就是这个子串sub,从pos位置开始找,默认的话就是从头开始找的,调用这个strstr函数,使用p指针接受这个返回值,如果找到的话,就返回这个下标,这个下标的计算方法就是指针详见求出这个指针之间的字符个数,否则的话就返回npos表示没有找到;

5.substr函数模拟实现

(1)substr就是用来提取这个子串的,就是对于一个字符串,abcdefgh这种的,我们可以从第几个位置开始进行提取,提取的长度也是自己可以进行规定的;

(2)我们传递的第一个参数就是pos,翻译过来就是这个从哪个位置开始查找,第二个参数就是这个npos,实际上就是这个子串的长度,我们下面如果找到了这个子串,就是使用的reserve函数开辟对应的大小的空间,这个s就是用来存放这个子串的;

(3)这个函数的用途就是之前提到的这个网络上面的网址,把他们的这个域名,协议之类的根据这个分隔符分隔开,我们完成这个函数的模拟实现之后可以尝试调用我们自己实现的函数,达到效果就说明这个 函数的模拟实现是成功的;

(4)下面的就是这个函数调用的过程,我们随意的给出一个链接就可以进行这个对应的测试,使用s3.substr进行这个函数的调用,i1就是这个find函数的返回值,实际上就是这个冒号位置的下标

(5)接下来我们进行这个测试的时候就会发现这个会崩溃掉,原因就是下面的,return s这个返回是一个传值返回,这个时候会执行相应的拷贝构造,然后再去赋值给这个sub1,因为这个sub1调用了这个函数;

 

(6)因为这个return 返回的时候执行的这个拷贝构造是一个浅拷贝,浅拷贝的话就会出现这个s会把空间给释放掉之后,赋值给s1的时候这个空间就已经不存在了,所以才会报错;

我们知道这个编译器会进行优化,但是这个地方不会进行优化,因为这个地方是执行的拷贝构造加上赋值,我们知道这个构造和拷贝构造同时发生的时候可能会被优化为一步,但是这个地方的拷贝构造和赋值不会被优化为一步;

(7)这个时候要想解决这个问题,首先必须要深刻地认识到这个问题,下面就是浅拷贝会出现这个崩溃的原因,s1是一个对象,s2是一个对象,我们想要把这个s1拷贝给s2,如果我们自己不去写的话,编译器就会默认执行浅拷贝,这样的话s2,s1就会指向同样的一块区域,释放一块的话就无法进行这个赋值了,因为这个浅拷贝之后substr函数被调用了,需要赋值给sub1;

这个就需要我们自己实现这个拷贝构造函数和赋值函数:

 

(8)要想规避上面涉及到的诸多问题,就需要我们新开辟一块空间,不要让这个新的对象和原来的对象指向相同的空间,然后把这个s1的东西拷贝给s2,在进行这个s2的大小和容量的更新即可;

 

(9)赋值函数,赋值和拷贝构造的区别就是 赋值是用这个已经创建的对象去初始化这个新的对象,我们下面就是使用这个已经创建的对象s初始化新的对象,例如我们想要使用s3赋值给s2吧,我们首先就是开辟出和s3相同大小的一个空间,记作temp临时空间,把这个s3的内容放到这个空间里面去,释放掉这个旧的空间,更新这个新空间的大小和容量;

这个时候我们使用自己的拷贝构造函数和这个赋值函数就可以区分出来这个域名,协议以及这个资源名了。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【算法】前缀和——前缀和

本题主要用一个模板题目来说明前缀和的基本思想&#xff0c;有需要借鉴即可。 目录 1.题目2.前缀和2.1题目分析2.2前缀和算法第一步&#xff0c;先预处理一个前缀数组第二步&#xff0c;由题计算得结果 3.代码示例4.总结 1.题目 题目链接&#xff1a;LINK 这个题目可以用暴力…

c 的库函数有哪些

C语言的库函数非常丰富&#xff0c;涵盖了多种功能&#xff0c;为程序员提供了大量的工具来完成各种任务。以下是一些主要的C语言库函数及其分类&#xff1a; 标准输入输出函数&#xff1a; printf()&#xff1a;用于输出格式化的数据到标准输出设备。scanf()&#xff1a;用于…

数字化农业新时代:图扑农林牧综合监控平台

利用图扑自研 HT for Web GIS 产品&#xff0c;结合遥感技术&#xff0c;构建可交互式的农林牧数据分析平台。该平台围绕地块总览、播种分析、牛只管理、设备查询四个维度&#xff0c;对地区的全貌、农场、村集体分布以及相应的环境进行多样化的可视化展示和进行数据支持&#…

网站报价明细

随着互联网的快速发展和普及&#xff0c;网站建设已经成为越来越多企事业单位必备的基础设施之一。作为企业展示形象和运营业务的重要平台&#xff0c;网站对于企业发展起着举足轻重的作用。因此&#xff0c;网站报价明细在企业进行网站建设时尤为重要。 网站报价明细是指在网站…

Java多线程(02)

一、如何终止线程 终止线程就是要让 run 方法尽快执行结束 1. 手动创建标志位 可以通过在代码中手动创建标志位的方式&#xff0c;来作为 run 方法的执行结束条件&#xff1b; public static void main(String[] args) throws InterruptedException {boolean flag true;Thr…

邦注科技三机一体除湿干燥机在工业中的应用

三机一体除湿干燥机在工业中的应用广泛且重要&#xff0c;其结合了传统除湿机、冷凝器和加热器的功能&#xff0c;具有节能、环保、方便等特点。以下是关于三机一体除湿干燥机在工业中应用的详细解析&#xff1a; 一、应用领域 电子制造行业&#xff1a;在半导体、集成电路和…

超清高帧,成像升级 | SWIR短波红外相机500万像素992芯片

博图光电5MP短波红外相机&#xff0c;搭载了索尼IMX992 SenSWIR传感器&#xff0c;支持5.2MP分辨率&#xff0c;适合探测波长在400nm-1700nm波段的可见光和短波红外光&#xff0c;有效面积和透光率得到提升&#xff0c;内置TEC制冷片&#xff0c;实现了像素尺寸和图像均匀性方面…

重学java 49 增强for

知之俞明&#xff0c;则行之越笃&#xff1b;行之愈笃&#xff0c;则知之愈益&#xff1b; —— 24.5.28 一、基本使用 1.作用: 遍历集合或者数组 2.格式: for(元素类型 变量名:要遍历的集合名或者数组名) 变量名就是代表的每一个元素 3.快捷键: 集合名或者数组名.for package …

AI大模型如何“开窍”?算法、数据与架构的三重奏

一、算法创新 1. 探索新的学习范式 自监督学习&#xff1a;利用未标注数据让模型自我学习&#xff0c;提高模型的泛化能力。元学习&#xff1a;让模型学会如何学习&#xff0c;以便在不同任务之间快速迁移。强化学习&#xff1a;通过试错与奖励机制&#xff0c;使模型在与环境…

外贸仓库管理软件:海外仓效率大幅度提升、避免劳动力积压

随着外贸业务的不断发展&#xff0c;如何高效管理外贸仓库&#xff0c;确保货物顺利流转&#xff0c;订单顺利处理&#xff0c;就变得非常重要。 现在通常的解决方案都是通过引入外贸仓库管理软件&#xff0c;也就是我们常说的海外仓WMS系统来解决。 今天我们就系统的探讨一下…

langchian进阶二:LCEL表达式,轻松进行chain的组装

LangChain表达式语言-LCEL&#xff0c;是一种声明式的方式&#xff0c;可以轻松地将链条组合在一起。 你会在这些情况下使用到LCEL表达式: 流式支持 当你用LCEL构建你的链时&#xff0c;你可以得到最佳的首次到令牌的时间(输出的第一块内容出来之前的时间)。对于一些链&#…

Rust最新版安装(v1.78.0+)

系统&#xff1a;Windows 11 专业版 23H2rustc&#xff1a;1.78.0 配置环境变量和设置配置文件 新建文件夹“C:\Rust\Rustup”和“C:\Rust\Cargo”。【以管理员身份运行】打开CMD 设置系统环境变量&#xff0c;如下设置RUSTUP_DIST_SERVER&#xff0c;其余同理 C:\Windows\S…

钡铼PLC集成BL121PO协议网关优化电子制造产线的生产效率

PLC转OPC UA协议转换网关BL121PO在电子制造产线中的优化应用&#xff0c;可以显著提高生产效率&#xff0c;促进生产线的智能化和信息化发展。本文将从以下几个方面进行阐述&#xff1a; 提高设备间通信效率&#xff1a;PLC转OPC UA协议转换网关BL121PO通过高效的协议转换&…

Keras深度学习框架第十九讲:在 KerasCV 中使用CutMix、MixUp 和 RandAugment 图像增强技术

1、绪论 1.1 图像增强的主流方法 CutMix CutMix 是一种图像增强技术&#xff0c;它通过从另一幅图像中随机裁剪一个区域并粘贴到当前图像上来创建新的训练样本。同时&#xff0c;标签也会按照两个图像中裁剪区域的比例进行混合。这种方法有助于模型学习如何处理部分遮挡的情…

VScode代码片段自动转图标

注&#xff1a;在VScode编辑器中&#xff0c;编辑html、vue等文件时&#xff0c;特定代码片段&#xff08;token/xxx’等&#xff09;自动转图标显示&#xff0c;按住“ctrl鼠标左键”还可跳转“https://icones.js.org/collections”&#xff0c;个人感觉干扰代码编写&#xff…

SD Flash介绍

作为一家专业生产存储芯片及存储卡的原厂&#xff0c;我们时常收到客户关于SD Flash的各种技术问题。MK米客方德将详细解答关于SD Flash的常见问题&#xff0c;助您更好地了解这一重要存储技术。 SD Flash是一种常见的存储卡技术&#xff0c;广泛应用于各种便携式设备中&#x…

《MySQL怎样运行的》-从一条记录说起-InnoDB记录存储结构

我们都知道MySQL是用来存储数据的&#xff0c;那你有没有的疑问&#xff0c;他是怎么存储的&#xff0c;它实际上是在使用储存引擎&#xff0c;那如果有人问你MySQL的储存引擎有哪些你该怎么说呢&#xff0c;主要是有InnoDB&#xff0c;MyISAM还有MEMORY&#xff0c;后面两种在…

webpack5基础和开发模式配置

运行环境 nodejs16 webpack基础 webpack打包输出的文件是bundle 打包就是编译组合 webpack本身功能 仅能编译js文件 开始使用 基本配置 五大核心概念 准备webpack配置文件 1.在根目录 2.命名为webpack.config.js 开发模式介绍 处理样式资源 处理css样式资源文件…

5W 1.5KVDC、3KVDC 宽电压输入 DC/DC 电源模块——TP05DA 系列,广泛应用于通信、铁路等设备中

TP05DA系列电源模块额定输出功率为5W&#xff0c;外形尺寸为31.75*20.32*10.65&#xff0c;应用于2:1及4:1电压输入范围 9V-18V、18V-36V、36V-72V、9V-36V和18V-72VDC的输入电压环境&#xff0c;输出电压精度可达1%&#xff0c;具有输出短路保护等功能&#xff0c;可广泛应用于…

导出excel带水印

需要一些前置知识(一些基本知识) 导出excel带水印:前置知识1 BufferedImage和ImageIO 导出excel带水印:前置知识2 Graphics2D用法 导出excel带水印:前置知识3 ByteArrayOutputStream 导出excel带水印:前置知识4 BigExcelWriter 导出excel带水印:前置知识5 POI包 前端代码就不贴…