C++实现list容器

news2024/11/28 8:30:01

目录

1.前言

2.实现list容器

2.1链表结构体

2.2list迭代器

迭代器的成员变量

迭代器的构造函数

迭代器的++,--

迭代器的==,!=

迭代器的解引用

迭代器的->

3.list类

构造函数

析构函数

插入

删除

头插、尾插

头删、尾删

begin、end

size

empty

拷贝构造函数

赋值运算符重载


1.前言

我们都知道C++中有一个list容器,有基础的人清楚它的底层是一个带头双向循环列表,但进一步的细节可能就不太了解,所以,本篇注重谈论list容器的底层细节。

——(护盾)【由于本篇注重于细节,所以不再会去解释基础语法的作用,因此本篇针对非小白学习者查阅,即有不错的面向对象知识体系和带头双向循环列表理解的群体】

2.实现list容器

2.1链表结构体

我们先分析一下list容器由几个类构成,首先最主题的肯定是list类

也就是这个,因为我们的增删查改的操作都是面向它来使用的,其次就要想一想了,成员变量是什么?我们知道它的底层是一个链表,所以我们的成员变量理应是一个链表结构体指针类型的变量。

这个链表结构体的实现并不难,一个前驱指针,一个后驱指针,一个数据变量,注意我们这里的变量都是指针和T类型数据,它本身没有对空间进行动态开辟等操作,所以走的都是浅拷贝,也就是说我们的析构都不用自己写,我们只需要写一个构造函数就可以了,我们采用构造列表的方式来给这些变量附上初始值。

链表结构体的内容其实主要就这些,接下来我们来看看它的迭代器。

2.2list迭代器

如果看过我前面两篇(vector,string)的同学可能知道之前的那两个迭代器我们都是用指针来实现的,也没啥门道,但是现在这个容器的迭代器就没有那么轻松了。

大家可以回顾一下,我们平时用迭代器类型的数据都进行过怎样的操作呢?是不是有++,--,==,!=,解引用,甚至还有->?接下来我们将对他们一一实现。

迭代器的成员变量

迭代器实际上操控的就是我们的链表结构体,所以我们的成员变量就只有一个结构体指针。

我们类模板定义的参数有三个,我们目前就只看T,后面两个参数用到了再讲,Node是我们的链表结构体,Self是我们的迭代器类型。

同样的对空间进行动态开辟的过程是交给list去干的,因此我们的迭代器类也不需要写析构,让它自动调用默认的就可以了。

迭代器的构造函数

就是这么简洁,只需要赋个值就可以了。

迭代器的++,--

我们分别实现了前置++,后置++,以及前置--和后置--。

这些都是老操作了,很好看懂。

迭代器的==,!=

这个操作就更简单了,我们直接来看最重要的解引用和->.

迭代器的解引用

里面的内容很好懂,返回链表结构体里的数据嘛,那这个Ref是什么呢?书接上回,我们迭代器类模板不是有三个参数嘛,他们的意思就是这个

就是带不带const的问题,为什么要这样子实现呢?因为倘若你不这样实现,他就得写两个几乎一模一样的迭代器类,这样代码就太冗余了。

看了这两个重命名大家就能知道Ref和Ptr的作用是什么了。

迭代器的->

->的用法主要是针对T类型是类的时候。

3.list类

实现了前面两个类之后,我们最后可以来实现list类了。(基础的我会一笔带过,难点我会细讲)

构造函数

list的构造函数需要我们创建节点,因此我们可以直接这样写:

析构函数

clear是用来清空数据但是一般不会释放内存空间,这里我们写一个不释放空间的版本。所以我们的析构函数就可以调用clear然后释放空间就可以了。

插入

插入我们的思路就是创建新节点,然后弄清前驱指针和后驱指针的对应顺序就可以了。

删除

删除也是差不多的思路,只需要理清前后指针,然后释放掉我们不要的链表结构体就可以了,注意这里要有一个返回值,这是为了避免迭代器因为释放空间而失效,所以我们要对它进行更新,不过在我们日常使用的时候最好的做法还是涉及到删除操作时我们的迭代器就不要再使用了,或者可以重新定义一下。

头插、尾插

头插和尾插我们都是复用insert的

头删、尾删

头删和尾删我们也是复用erase的

begin、end

size

empty

拷贝构造函数

这里我们可以采取2尾插的方式来进行拷贝构造。

赋值运算符重载

我们的参数写成这样就可以让它去自动调用拷贝构造函数,这样做的好处是不会影响到传过来的list类型的变量,而且出了这个函数它会自动调用析构函数不需要我们手动来释放。然后将l1与lt的数据进行交换就可以了。(lt就相当于中转站)

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

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

相关文章

第23次修改了可删除可持久保存的前端html备忘录:增加了百度引擎

第22次修改了可删除可持久保存的前端html备忘录视频背景分离&#xff0c;增加了本地连接&#xff0c;增加了纯CSS做的折叠隐藏修改说明 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport…

采用Flink CDC操作SQL Server数据库获取增量变更数据

采用Flink CDC操作SQL Server数据库获取增量变更数据 Flink CDC 1.12版本引入了对SQL Server的支持&#xff0c;包括SqlServerCatalog和SqlServerTable。在SqlServerCatalog中&#xff0c;你可以根据表名获取对应的字段和字段类型。 SQL Server 2008 开始支持变更数据捕获 (C…

数码相框-显示JPG图片

LCD控制器会将LCD上的屏幕数据映射在相应的显存位置上。 通过libjpeg把jpg图片解压出来RGB原始数据。 libjpeg是使用c语言实现的读写jpeg文件的库。 使用libjpeg的应用程序是以"scanline"为单位进行图像处理的。 libjpeg解压图片的步骤&#xff1a; libjpeg的使…

FPGA:图像数字细节增强算法(工程+仿真+实物,可用毕设)

目录 日常唠嗑一、视频效果二、硬件及功能1、硬件选择2、功能3、特点 未完、待续……四、工程设计五、板级验证六、工程获取 日常唠嗑 有2个多月没写文章了&#xff0c;又是老借口&#xff1a;“最近实在是很忙”&#x1f923;&#xff0c;不过说真&#xff0c;确实是比较忙&am…

AWS服务器有哪些优势?

作为一家总部在美国的公司&#xff0c;AWS为什么会受到中国企业的喜爱&#xff1f;他有什么优势&#xff1f;九河云作为AWS合作伙伴&#xff0c;将会带读者展现使用AWS的优势。 首先是作为跨国企业&#xff0c;AWS在全球有数十个区域节点&#xff0c;这种广泛的地域覆盖不仅有…

【简单讲解下Kotlin】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

[大模型]基于 ChatGLM3 和 LangChain 搭建知识库助手

基于 ChatGLM3 和 LangChain 搭建知识库助手 环境配置 在已完成 ChatGLM3 的部署基础上&#xff0c;还需要安装以下依赖包&#xff1a; pip install langchain0.0.292 pip install gradio4.4.0 pip install chromadb0.4.15 pip install sentence-transformers2.2.2 pip inst…

详解TCP和UDP协议的区别

一、前言 TCP和UDP协议是TCP/IP协议的核心。TCP 传输协议&#xff1a;TCP 协议是一TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输&#xff0c;它提供的服务包括数据流传送、可靠性、有效流控、全双…

实时时钟模块RX8900CE为电子产品设备提供精准时间,能够适应极度紧凑的空间

随着电子技术飞速发展&#xff0c;越来越多的设备需要用到实时时钟电路。而过往的实时时钟电路&#xff0c;大多是分立式的架构&#xff0c;外围有不少的元器件&#xff0c;不但成本高昂&#xff0c;而且稳定性也不高&#xff0c;在严苛的工作条件下就显得有点力不从心。作为设…

ARM单片机的GPIO口在控制不同LED、按键时的设置

个人备忘&#xff0c;不喜勿喷。 GPIO口在驱动共阴极、共阳极LED灯时需要不同的初始化设置 对于这一类的led灯&#xff1a; 最好选择推挽、上拉、高速输出&#xff0c;同时IO口初始化时需要拉高。 上面这种需要下拉输入&#xff1b; 上图这种需要上拉输入&#xff0c;这样才…

聊一聊一些关于npm、pnpm、yarn的事

前言 整理了最近的闲聊&#xff0c;话题是前端各个包管理器&#xff0c;如果分享的不对或者有异议的地方&#xff0c;麻烦请及时告诉我~ 耐心看完&#xff0c;也许你会有所收获~ 概述 本文阅读时间&#xff1a;10-15分钟左右&#xff1b; 难度&#xff1a;初级&#xff0c…

LeetCode 2529. 正整数和负整数的最大计数——每日一题

上一篇博客&#xff1a;LeetCode 993. 二叉树的堂兄弟节点——每日一题 写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.…

【计算机考研】408网课汇总+资源分享

王道的四件套无疑是大多数同学的首选。相比其他课程来说&#xff0c;也是属于市面上最好的408课程了。 从今年的难度来看选择题部分和计网&#xff0c;比起往年来看是有很多偏题&#xff0c;大题除了计网的冷门外&#xff0c;其他倒是中规中矩。总体来看24考研的408难度是非常…

Win11 使用 WSL2 安装 linux 子系统 ubuntu

Win11 使用 WSL2 安装 linux 子系统 ubuntu 段子手168 1、用 部署映像服务和管理工具 dism.exe 命令&#xff0c;开启 WSL2 按【WIN R】&#xff0c;打开【运行】&#xff0c;输入&#xff1a;【cmd】&#xff0c;管理员打开【命令行提示符】。 启用适用于 Linux 的 Windo…

单例模式(饿汉模型,懒汉模型)

在着里我们先了解什么是单例模式。 就是某个类在进程中只能有单个实例&#xff0c;这里的单例模式需要一定的编程技巧&#xff0c;做出限制&#xff0c;一旦程序写的有问题&#xff0c;创建了多个实例&#xff0c;编程就会报错。 如果我们学会了单例模式&#xff0c;这种模式…

ORAN C平面 Section Extension 22

ORAN C平面Section扩展22用于ACK/NACK请求。除section type 7外&#xff0c;section扩展22可以用于从O-DU发送到O-RU的所有section type和section扩展。 对于一个section描述&#xff0c;O-DU可以使用section扩展22要求O-RU使用section type 8 C平面消息进行ACK/NACK反馈。关于…

Spring Validation解决后端表单校验

NotNull&#xff1a;从前台传递过来的参数不能为null,如果为空&#xff0c;会在控制台日志中把message打印出来 Range&#xff1a;范围&#xff0c;最大多少&#xff0c;最小多少 Patten&#xff0c;标注的字段值必须符合定义的正则表达式&#xff08;按照业务规则&#xff0…

智慧公厕是智慧城市建设中不可或缺的一部分

智慧城市的数字化转型正在取得显著成效&#xff0c;各项基础设施的建设也在迅速发展&#xff0c;其中智慧公厕成为了智慧城市体系中不可或缺的一部分。作为社会生活中必要的设施&#xff0c;公共厕所的信息化、数字化、智慧化升级转型能够实现全区域公共厕所管理的横向打通和纵…

T527 Qt 触摸 ----- TSLIB

一、调试 1、驱动路径 bsp/drivers/input/ctp/gt9xx/gt9xx_ts.c 2、硬件接口 挂载在TWI0下 3、中断复位脚 4、设备树 &twi0 {clock-frequency <400000>;pinctrl-0 <&twi0_pins_default>;pinctrl-1 <&twi0_pins_sleep>;pinctrl-names &quo…

vue通过echarts实现数据可视化

1、安装echarts cnpm install echarts -Sechart官方图表示例大全&#xff1a;https://echarts.apache.org/examples/zh/index.html#chart-type-line 2、代码实现 <template><div><div class"box" ref"zhu"></div><div class&…