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的内容放到这个空间里面去,释放掉这个旧的空间,更新这个新空间的大小和容量;

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

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

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

相关文章

网上3d全景虚拟交互展馆沉浸式体验让客户和使用者都满意

在数字化浪潮席卷而来的今天&#xff0c;3D场景网站已成为众多行业展现创意与实力的新舞台。然而&#xff0c;传统的3D建模软件往往因其复杂性和高门槛&#xff0c;让许多渴望创建逼真3D场景的用户望而却步。 幸运的是&#xff0c;华锐视点推出了搭建3D场景网站的编辑器——一款…

怎么做图片海报二维码?扫码查看图片内容

现在很多的宣传推广海报会放入二维码中&#xff0c;然后将二维码分享给用户后&#xff0c;通过扫码的方式来查看图片内容&#xff0c;从而获取自己需要的信息&#xff0c;经常在活动宣传、商品推广、旅游攻略等场景下使用。二维码可以提供更加便捷的内容获取方式&#xff0c;让…

[图解]企业应用架构模式2024新译本讲解02-表数据入口

1 00:00:00,420 --> 00:00:04,330 这个案例&#xff0c;我们就是用书上的案例了 2 00:00:06,080 --> 00:00:08,860 收入确认的一个案例 3 00:00:09,510 --> 00:00:11,100 书上讲了&#xff0c;收入确认 4 00:00:13,330 --> 00:00:15,270 就是说&#xff0c;你给…

一文搞透常见的Python编码陷阱(下)(分析+案例)

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 一、当心多目标赋值中的可变变量 示例 扩展讲解 示例 增广赋值中的可变变量 示例 扩展讲解 示例 总…

python 遍历从重命名文件夹下的所有文件

收到一个文件包&#xff0c;里面的文件命名是1.png、2.png……但在手机上打开时&#xff0c;是按1/10/11/12这样排序的&#xff0c;不是按数字从小到大。因此&#xff0c;需要将所有的文件重命名为001.png这种带0前缀的格式。 import os import redef traverse_rename(path):f…

Python魔法之旅-魔法方法(01)

目录 一、概述 1、定义 2、作用 二、主要应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类…

品牌曝光秘籍:让更多人知道你的品牌,这些推广技巧必学

最近遇到了不少满怀激情的创业者&#xff0c;他们刚刚创立了自己的品牌。在品牌诞生的初期&#xff0c;他们满怀喜悦&#xff0c;但对于如何进行品牌推广却感到迷茫。 这里可以详细讲讲&#xff0c;对于以线上为主的新品牌来说&#xff0c;前期的推广策略应该从何着手&#xf…

window安装ffmpeg播放本地摄像头视频

1、安装ffmpeg ffmpeg官方网站&#xff1a;FFmpeg 下载后解压文件夹名为ffmpeg 2、设置环境变量 目录 1、安装ffmpeg 设置环境变量 以F:\software\after\ffmpeg\bin为例 在命令行中输入ffmpeg出现下方代表安装成功 3、通过ffmpeg播放本地电脑摄像头 鼠标右击开始按钮&…

SQL Server 查询语句详解

SQL Server 查询语句详解 SQL Server 是一个功能强大的关系型数据库管理系统&#xff0c;它使用 SQL&#xff08;结构化查询语言&#xff09;作为与数据库交互的标准语言。在 SQL Server 中&#xff0c;查询语句&#xff08;通常称为 SELECT 语句&#xff09;是最常用和最基本…

AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.04.25-2024.05.01

文章目录~ 1.Soft Prompt Generation for Domain Generalization2.Modeling Caption Diversity in Contrastive Vision-Language Pretraining3.Q-GroundCAM: Quantifying Grounding in Vision Language Models via GradCAM4.HELPER-X: A Unified Instructable Embodied Agent t…

计算机设计大赛

目录 1.1需求分析 2.1概要设计 3.1软件界面设计&#xff1a; 4.1代码开源 1.1需求分析 1.1 产品开发本说明&#xff1a; 在如今每人都会扔出许多垃圾&#xff0c;在一些地方大部分垃圾能得到卫生填埋、焚烧等无害化处理&#xff0c;而更多的垃圾则是简单的掩埋&#xff…

范罗士、希喂、安德迈爆款宠物空气净化器哪款好?深度对比测评

作为一名深受养猫过敏困扰的铲屎官&#xff0c;我经常提醒新手铲屎官重视家里的空气环境。宠物的浮毛和皮屑不仅会引发过敏&#xff0c;还可能传播细菌和病毒。很多人以为普通空气净化器能解决问题&#xff0c;但这些产品并未针对宠物家庭的特殊需求。经过多次研究和测试&#…

一些Spring的理解

说说你对Spring的理解 首先Spring是一个生态&#xff1a;可以构建企业级应用程序所需的一切基础设施 但是&#xff0c;通常Spring指的就是Spring Framework&#xff0c;它有两大核心&#xff1a; IOC和DI 它的核心就是一个对象管理工厂容器&#xff0c;Spring工厂用于生产Bea…

定积分的应用

目录 前提知识 考题类型&#xff1a;平面图形面积、旋转体体积、旋转体侧面积、平面曲线弧长 两种坐标&#xff1a;极坐标和直角坐标系 求解思路&#xff1a; 注意&#xff1a; 1:平面图形的面积&#xff1a; 常见模型&#xff1a; 面积元素的两种表达&#xff1a;积分区…

PowerMock入门:Java单元测试的终极武器

在软件开发过程中&#xff0c;单元测试是确保代码质量的重要环节。它帮助开发者验证代码的各个部分是否按照预期工作&#xff0c;从而提高软件的稳定性和可维护性。然而&#xff0c;传统的单元测试工具&#xff0c;如JUnit和Mockito&#xff0c;虽然功能强大&#xff0c;但在某…

网络流量分析系统详解:提高网络性能的利器

目录 什么是网络流量分析系统&#xff1f; 网络流量分析的作用 网络流量分析系统的工作原理 数据采集技术 数据处理和分析方法 网络流量分析系统的应用场景 企业网络 数据中心 电信运营商 如何选择合适的网络流量分析系统 功能需求 性能和扩展性 易用性 安全性 …

Postman入门 - 环境变量和全局变量

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、发送请求 二、设置并引用环境变量 比如&#xff1a;我建的这个生产环境 使用环境有两个方式&…

Java 理解和使用compareTo和compare方法

在Java编程中&#xff0c;经常需要对对象进行排序。为了实现排序功能&#xff0c;Java提供了两种主要的方法&#xff1a;compareTo和compare。尽管它们都用于比较对象&#xff0c;但它们在使用场景和定义位置上有所不同。本文将详细探讨这两种方法的区别、用途以及如何在实际项…

弘君资本炒股技巧:股票定向增发是什么意思?是好是坏?

股票定向增发是指已上市的公司向指定的组织或者个人投资者额外发行股份募集资金的融资方法&#xff0c;发行价格为发行前某一阶段的平均价的必定比例&#xff0c;增发的价格不得低于前二十个买卖日股票均价的80&#xff05;。 例如&#xff0c;个股定增前二十个买卖股票平均价为…

平方回文数-第13届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第73讲。 平方回文数&#…