C++~~string模拟实现(3)

目录

1.传统写法和现代写法

2.对于流提取的优化

3.简单机制了解

4.string类的几个构造函数总结

4.1基本用法

4.2两个赋值方式

4.3拷贝构造

4.4获取字符

4.5一个容易混淆的对比

4.6创建对象


1.传统写法和现代写法

(1)上面的代码里面的左边部分是现代的拷贝和赋值的写法,右边是完全我们自己实现的,这两者仅仅在代码的简洁度上面有所区别,其他的大体相同;

(2)现代的写法里面,我们使用的初始化列表进行初始化,调用swap函数进行这个交换同样也是可以达到这个拷贝构造的目的,实际上这个temp就是s3的拷贝,想要达到的效果就是s2和s3一样,这个swap实际上就是s2这个对象调用的;

(3)赋值函数的现代写法就更加简洁了,因为我们在进行赋值的时候,主要考虑的问题就是原来空间的释放问题,我们把原来的空间数据拷贝给s2之后,原来的空间要被释放掉,这个时候的temp也会因为执行析构函数达到空间释放的目的;

2.对于流提取的优化

(1)我们之前对于流提取,就是满了就开空间,不满的话就会一直向这个里面填充数据,满的话需要进行自动的扩容,但是我们优化的话,就会尽量减少这个扩容的空间;

(2)我们使用的方法就是定义一个数组buffer,先把这个数据存到buffer里面去,然后满了128之后再加到我们自己定义的形参s里面去,如果我们输入的字符串很长,就会128,128的往里面添加(每次满128之后就会把这个循环变量i重新置为0),如果我们输入的字符串很短,就会直接添加到buffer,然后加到s里面去; 

(3)这样做的好处就是我们可以尽量减少这个capacity的大小,不是像之前那样二倍二倍的进行扩容;

3.简单机制了解

(1)就是浅拷贝的问题我们可以使用深拷贝的方式进行解决,但是如果我们不想开辟新的空间,就可以使用这个引用计数的方式进行解决,就是当浅拷贝,一个空间被多个指针指向的时候,我们就是用一个具体的数字进行计数,当这个引用计数的数字是0的时候,我们再把这个空间给释放掉 

(2)另外一个浅拷贝的问题就是一个空间有多个指针指向,我们对于某个数据进行修改的时候,就会影响另外一个指向这个空间的指针变量,这个时候我们就可以使用写时拷贝技术,当我们需要对于这个数据进行修改的时候,我们再去进行深拷贝,这样的话就相当于延迟拷贝,需要时候我们再去执行深拷贝;

4.string类的几个构造函数总结

4.1基本用法

4.2两个赋值方式

下面的两个方式都是等效的,都是相当于对于这个字符串进行初始化赋值操作;

4.3拷贝构造

C++里面的string容器的拷贝构造都是深拷贝的,就是这个不在一块内存区域上面;

4.4获取字符

如果第二个参数比我们的字符串的长度小,我们就会截取指定长度的字符;

但是如果我们的长度比这个字符串更长,我们就会截取字符串全部内容,包括一些内存里面的随机存放的内容,他是不会达到这个斜杠0就自动停止的;

4.5一个容易混淆的对比

s3就是上面的实例里面的hello world字符串,3,3就是表示的从第三个下标位置开始,读取三个字符的内容;

s9是只给出来了第二个参数,我们这个时候就会直接读取到斜杠0才结束,并不会向上面的一样读取后面的随机内容;

但是如果我们把这个s3换为正式的字符串内容,我们感觉这个好像并没有影响,实际上这个输出的结果还是有一些差别的;

对于这个s11的内容,会按照上面的4.4里面的构造函数打印输出的,因为这个参数和4.4里面的构造函数更加接近;

4.6创建对象

这个构造函数里面是有两个参数,表示创建n个x字符的对象,n就是第一个参数,x就是我们创建的对象里面的字符;

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

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

相关文章

51单片机-第五节-串口通信

1.什么是串口? 串口是通讯接口,实现两个设备的互相通信。 单片机自带UART,其中引脚有TXD发送端,RXD接收端。且电平标准为TTL(5V为1,0V为0)。 2.常见电平标准: (1)TTL电…

pycharm+pytorch+gpu开发环境搭建

一、安装anacoda 1、下载Anaconda安装包 官网下载地址 https://www.anaconda.com/distribution/ 清华镜像 Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载python3.8对应的版本Anaconda3-2021.04-Windows-x86_64.exe 下载完成…

Vue中常用指令简介

一. V-html 作用:更新元素的innerHTML,拥有响应式的特点,即数据驱动视图,解析标签,作用类似于js中获取dom对象,然后再进行innerHTML赋值。 展示了一下v-html解析标签的特点,这算是和插值表达式…

【网络安全的神秘世界】文件包含漏洞

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 一、概述 文件包含:重复使用的函数写在文件里,需要使用某个函数时直接调用此文件,而无需再…

【Linux】生产者消费者模型 + 线程池的介绍和代码实现

前言 上节我们学习了线程的同步与互斥,学习了互斥锁和条件变量的使用。本章我们将学习编程的一个重要模型,生产者消费者模型,并且运用之前学的线程同步和互斥的相关接口来实现阻塞队列和环形队列,最后再来实现一个简易的线程池。 …

国科大作业考试资料《人工智能原理与算法》2024新编-第十三次作业整理

1、假设我们从决策树生成了一个训练集,然后将决策树学习应用于该训练集。当训练集的大小趋于无穷时,学习算法将最终返回正确的决策树吗?为什么是或不是? 本次有两个参考: 参考一: 当训练集的大小趋于无穷…

普中51单片机:蜂鸣器的简单使用(十一)

文章目录 引言蜂鸣器的分类工作原理无源蜂鸣器压电式蜂鸣器:电磁式蜂鸣器: 电路符号及应用代码演示——无源蜂鸣器 引言 蜂鸣器是一种常见的电子音响器件,广泛应用于各种电子产品中。它们能够发出不同频率的声音,用于警报、提醒、…

整数二分详解【附带PPT】

#include<bits/stdc.h> using namespace std; int n,a[1001],k;int b_search1(int l,int r,int k){while(l<r){int mlr1>>1;//检查是否满足橙色性质 if(a[m]<k) lm;else rm-1;}//循环结束l和r同时指向边界 return l; }int b_search2(int l,int r,int k){whil…

【Linux】进程间通信(1):进程通信概念与匿名管道

人与人之间是如何通信的&#xff1f;举个简单的例子&#xff0c;假如我是月老&#xff0c;我要为素不相识的但又渴望爱情的男女两方牵红线。我需要收集男方的信息告诉女方&#xff0c;收集女方的信息告诉男方&#xff0c;然后由男女双方来决定是否继续。对于他们而言&#xff0…

Python | Leetcode Python题解之第275题H指数II

题目&#xff1a; 题解&#xff1a; class Solution:def hIndex(self, citations: List[int]) -> int:n len(citations)left 0; right n - 1while left < right:mid left (right - left) // 2if citations[mid] > n - mid:right mid - 1else:left mid 1retur…

【Linux C | 网络编程】进程池大文件传输的实现详解(三)

上一篇实现了进程池的小文件传输&#xff0c;使用自定义的协议&#xff0c;数据长度数据本身&#xff0c;类似小火车的形式&#xff0c;可以很好的解决TCP“粘包”的问题。 【Linux C | 网络编程】进程池小文件传输的实现详解&#xff08;二&#xff09; 当文件的内容大小少于…

html+css 动态效果

1.波浪效果 <div class"sitesingle"></div> <style>.sitesingle{display:flex;justify-content:space-between;align-items:stretch;overflow:hidden;position:relative;height: 400px;}keyframes bgRotate{0%{transform:rotate(0deg)}to{transfor…

基于关联规则的分类算法(CBA) | 项集、频繁项集、关联规则 | arulesCBA库

基于关联规则的分类算法 目前使用较多且较为简洁的关联规则分类算法是基于关联规则的分类算法&#xff08;Classification Based on Association, CBA&#xff09;&#xff0c;下面将从该算法的相关概念开始介绍。 这部分笔记参考论文&#xff1a;孙菡悦.基于多因素交互效应的…

C++的STL简介(一)

目录 1.什么是STL 2.STL的版本 3.STL的六大组件 4.string类 4.1为什么学习string类&#xff1f; 4.2string常见接口 4.2.1默认构造 ​编辑 4.2.2析构函数 Element access: 4.2.3 [] 4.2.4迭代器 ​编辑 auto 4.2.4.1 begin和end 4.2.4.2.regin和rend Capacity: 4.2.5…

repo中的default.xml文件project name为什么一样?

文章目录 default.xml文件介绍为什么 name 是一样的&#xff0c;path 不一样&#xff1f;总结 default.xml文件介绍 在 repo 工具的 default.xml 文件中&#xff0c;定义了多个 project 元素&#xff0c;每个元素都代表一个 Git 仓库。 XML 定义了多个不同的 project 元素&…

树和二叉树(不用看课程)

1. 树 1.1 树的概念与结构 树是⼀种非线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 • 有⼀个特殊的结点&am…

GD32相较于STM32的优劣势-完全总结

优势 1.更高的主频 GD32单片机的主频可以达到108MHz&#xff0c;‌而STM32的最大主频为72MHz&#xff0c;‌这意味着GD32在代码执行速度上具有优势&#xff0c;‌适合需要快速处理数据的场景 2.更低的内核电压 GD32的内核电压为1.2V&#xff0c;‌而STM32的内核电压为1.8V。…

《系统架构设计师教程(第2版)》第12章-信息系统架构设计理论与实践-05-信息系统架构案例分析

文章目录 1. 价值驱动的体系结构——连接产品策略与体系结构1.1 价值模型1&#xff09;概述2&#xff09;价值驱动因素3&#xff09;传统方法识别价值模型的缺陷&#xff08;了解即可&#xff09; 1.2 体系结构策略&#xff08;挑战&#xff09;1&#xff09; 优先级的确定2&am…

【C++】动态内存管理与模版

目录 1、关键字new&#xff1a; 1、用法&#xff1a; 2、理解&#xff1a; 3、与malloc的相同与不同&#xff1a; 1、相同&#xff1a; 2、不同&#xff1a; 2、模版初阶&#xff1a; 1、函数模版&#xff1a; 1、概念&#xff1a; 2、关键字&#xff1a;template&…

微信公众号获取用户openid(PHP版,snsapi_base模式)

微信公众号获取用户openid的接口有2个&#xff1a;snsapi_base、snsapi_userinfo 详情见微信公众号开发文档&#xff1a;https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html 本文介绍用PHP方式调用snsapi_base接口获取微信用户…