list模拟实现

一、结点的定义

有三个成员,2个指向前面和后面的指针,一个表示结点存储T类型的值。

对于_prev和_next,类型是  list_node<T>*,不是list_node*,加上类型参数T之后,才是模板类的类型。

构造函数中,先把指针置空,然后val可以给一个默认构造的缺省值。

二、普通正向迭代器

先将list_node<T> typedef为Node,便于后续使用更方便。

一个成员变量为  Node* _node,表示迭代器当前指向的那个结点。

构造函数中,用传入的node,初始化_node,指针为内置类型,浅拷贝即可。

1、operator*()

对迭代器解引用,返回的是那个T类型的值val的引用。(无论T是内置类型还是自定义类型)

2、operator->()

返回的是val的地址。

val是结构体/自定义类型,val内部可能还有多个要访问的值

可以直接通过返回的地址/指针,用->找到其中要访问的值。

3、++/--/==

 ++是让迭代器指向下一个结点,即让其成员_node变为_node->next。--同理。

前置++和--返回下一个/前一个迭代器位置,即改变后的*this的引用

后置++和--要先用tmp保存改变前的位置,最后传值返回tmp的拷贝

三、const迭代器

首先,对于所有迭代器,都是可以++,--修改的。

对于T*这种由原生指针(指针解引用就可以访问,且内存连续,++直接找到下一个结点)构成的迭代器,直接在 T*前加const,使得其无法解引用修改存储的值即可构成const_iterator。

但由于list中,内存不连续,且有时解引用得到的val为结构体(不方便)。

我们需要对++,--,*,->等进行运算符重载,因此就要定义一个__list_iterator的结构。

直接在迭代器类型前加const是错误的,这样使得const_iterator的类型变成了一个const对象,不能进行++,--等操作。const_iterator的const修饰的是对访问那个结点的值是否具有修改的权限

如上图,返回的引用的值是否加const 修饰。

对于函数重载,我们只能通过参数类型/个数/顺序来区分,这里是仅通过返回值无法区分两个operator*()。

一种解决方法是重新定义一个const_iterator结构,仅在operator*()这里与iterator不同,但代码冗余度太大,重复部分太多。

还有一种方法是引入新的模板参数  Ref作为引用的返回值

iterator和const_iterator靠Ref和Ptr两个模板参数区分。看传入的T&和T*是否加const修饰。

实际上,两种迭代器仍然是两种结构,只不过我们用模板传入模板参数,让编译器生成了两个模板类,两个模板类通过对访问数据是否有修改来区分。

先在ls内插入数据,然后用const引用接收,在Print函数内,*cit无法被修改 

四、insert/erase

 

五、拷贝构造/operator= 

 空初始化为创建头节点,用的地方比较多,可以单独拿出来。

拷贝构造直接循环尾插即可。

赋值重载使用现代写法,交换得到_head指向拷贝得到的list。

注意:由于ls被const修饰,beign()返回的是const_iterator,需要用const迭代器接收

ls要完成交换,不能加const    std::swap需要两个参数

六、clear/析构

循环删除时迭代器会失效,接收返回值更新一下。 

 

size()函数每次统计结点个数为O(N)

也可以增加一个成员变量,每次插入时++,删除时-- 

目录

一、结点的定义

二、普通正向迭代器

1、operator*()

2、operator->()

3、++/--/==

三、const迭代器

四、insert/erase

五、拷贝构造/operator= 

六、clear/析构


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

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

相关文章

大模型时代,腾讯云“复制”腾讯|WAIC2023

点击关注 文&#xff5c;郝鑫 编&#xff5c;刘雨琦 刚过去的WAIC&#xff08;世界人工智能大会&#xff09;俨然成为了大模型厂商的成果汇报大会。 百度文心大模型升级到3.5版本&#xff0c;训练速度提升2倍&#xff0c;推理速度提升30倍&#xff1b;华为云发布盘古大模型3…

【数学建模】统计分析方法

文章目录 1.回归分析2. 逻辑回归3. 聚类分析4. 判别分析5. 主成分分析6. 因子分析7. 对应分析 1.回归分析 数据量要多&#xff0c;样本总量n越大越好——>保证拟合效果更好&#xff0c;预测效果越好 一般n>40/45较好 方法 建立回归模型 yiβ0β1i……βkxkiεi 所估计的…

❤️创意网页:HTML5,canvas创作科技感粒子特效(科技感粒子、js鼠标跟随、粒子连线)

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

Gateway网关组件(在Spring Cloud整合Gateway(idea19版本))

Spring Cloud Gateway官网:Spring Cloud Gateway 局域网中就有网关这个概念&#xff0c;局域网接收数据或发送数据都要通过网关&#xff0c;比如使用VMware虚拟机软件搭建虚拟机集群的时候&#xff0c;往往我们需要选择IP段中的⼀个IP作为网关地址,网关可以对请求进行控制,提升…

CSS科技感四角边框

实现效果:使用before和after就可以实现,代码量不多,长度颜色都可以自己调整 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title><style>*{margin:0;padding:0;}html,body{…

MySQL数据备份与恢复

目录 ​编辑 一、数据备份 1.1物理备份 1.1.1冷备份 1.1.2热备份 1.1.3温备份 二、逻辑分区 2.1完全分区 2.2差异分区 2.3增量备份 三、数据备份恢复实验 3.1做一个数据 3.2物理冷备份与恢复 3.3mysqldump 备份与恢复&#xff08;温备份&#xff09; 3.4Mysql数据…

TinyKv流程梳理三

split流程 处理协程启动 func (bs *Raftstore) startWorkers(peers []*peer) {ctx : bs.ctxworkers : bs.workersrouter : bs.routerbs.wg.Add(2) // raftWorker, storeWorkerrw : newRaftWorker(ctx, router)go rw.run(bs.closeCh, bs.wg)sw : newStoreWorker(ctx, bs.store…

GIT常用命令汇总

文章目录 新建仓库git clone克隆一个仓库指定版本到指定文件夹克隆带子模块的仓库 子模块添加子模块删除子模块切换子模块分支更新子模块 GIT IGNORE忽略文件添加忽略某个文件夹下所有文件刷新.gitignore使其生效 参考链接&#xff1a; 新建仓库 git clone 语法如下&#xff…

Centos 7 安装 Oracle 11G

Oracle 11G 安装教程 准备环境 p13390677_112040_Linux-x86-64_1of7.zipp13390677_112040_Linux-x86-64_2of7.zipCentos 7- rhel7-英文版的系统–不想换语言的执行(LANGen_US)– 传输 文件到服务器上 创建用户和组 [rootlocalhost ~]# groupadd oracle [rootlocalhost ~]…

ASUS华硕飞行堡垒8笔记本FX506LH LI LU FX706原装出厂 Win10系统工厂模式20H2

自带所有驱动、出厂主题壁纸LOGO、Office办公软件、MyASUS电脑管家、奥创控制中心等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&#xff1a;HDI,SWP,OFS,EDN,KIT,TLK多个底包 文件大小&#xff1a;10.95GB 注&#xff1a;恢复时会清空电脑上所有盘的数据&…

OpenCV中的RGB与YUV转换

1 基本概念 YUV 颜色空间从模拟电视时代开始就被广泛应用于彩色图像的转换与处理。其基于一个 3x3 的矩阵&#xff0c;通过线性变换将 RGB 像素转换为一个亮度&#xff08;Luma&#xff09;分量 Y 以及两个色度&#xff08;Chroma&#xff09;分量 U 和 V。由于模拟电视存在着多…

曲师大2023大一新生排位赛-B.Sort题解

题目描述 插入排序是一种非常常见且简单的排序算法。王同学是一名大一的新生&#xff0c;今天许师哥刚刚在上课的时候讲了插入排序算法。 假设比较两个元素的时间为 &#xff0c;则插入排序可以以 的时间复杂度完成长度为 n&#xfffd; 的数组的排序。不妨假设这 n 个数字分…

JavaWeb(4)——HTML、CSS、JS 快速入门

一、JavaScript 数组 数组筛选&#xff08;查找&#xff0c;将原来数组中的某些数据去除&#xff09; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&quo…

【Hydro】一个简单的HBV水文模型产流Python实现

说明 HBV模型包括一系列自由参数&#xff0c;其值可以通过率定得到。同时也包括一些描述流域和气候特征的参数&#xff0c;它们的值在模型率定是假定不变。子流域的划分使得在一个子流域中可能有很多参数值。虽然在大多数应用中&#xff0c;各子流域之间参数值只有很小的变化&a…

webpack插件compression-webpack-plugin

Vue配置compression-webpack-plugin实现Gzip压缩 1、为什么要压缩&#xff1f; 打包的时候开启gzip可以很大程度减少包的大小&#xff0c;页面大小可以变为原来的30%甚至更小&#xff0c;非常适合于上线部署。更小的体积对于用户体验来说就意味着更快的加载速度以及更好的用户…

使用IDEA社区版创建SpringBoot项目

文章目录 1.关于IDEA社区版的版本2.下载Spring Boot Helper3.创建项目4.配置Maven国内源4.1找不到settings.xml的情况4.2找得到settings.xml的情况 4.3删除repository目录下的所有文件和目录5.加载项目6.解决org.springframework.boot:spring-boot-starter-parent:pom:2.7.13.R…

NXP i.MX 6ULL工业开发板硬件说明书( ARM Cortex-A7,主频792MHz)

前 言 本文档主要介绍TLIMX6U-EVM评估板硬件接口资源以及设计注意事项等内容。 创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的评估板&#xff0c;由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证&#xff0c;稳…

我们如何在 Elasticsearch 8.6、8.7 和 8.8 中加速数据摄入

作者&#xff1a;Adrien Grand, Joe Gallo, Tyler Perkins 正如你们中的一些人已经注意到的&#xff0c;Elasticsearch 8.6、8.7 和 8.8 在各种数据集上带来了良好的索引加速&#xff0c;从简单的关键字到繁重的 KNN 向量&#xff0c;以及摄取管道繁重的摄取工作负载。 摄取涉及…

Java Mybatis拓展03

0目录 1.MyBatis当实体类和数据库字段名不对应 2.多表查询 1.MyBatis当实体类和数据库字段名不对应 方法2 测试 多表查询 加入子标签association 模糊查询 加入Address 对象 三表联查 2.五表联查 测试

使用 appium 进行微信小程序的自动化测试

目录 前言&#xff1a; 微信小程序结构 自动化用例的调整 示例代码 后记 前言&#xff1a; 微信小程序是一种流行的移动应用程序&#xff0c;它在移动设备上提供了丰富的功能和用户体验。为了确保微信小程序的质量和稳定性&#xff0c;自动化测试是必不可少的一环。Appiu…