C++STL之List的实现

首先我们要实现List的STL,我们首先要学会双向带头链表的数据结构。那么第一步肯定是要构建我们的节点的数据结构。

首先要有数据域,前后指针域即可。

再通过模板类进行模板化。

然后再写List的构造函数,这个地方用T&,通过引用就可以减少一次形参拷贝的发生,提高性能。

其次const可以提高安全性和扩展性,这样const T&和T&就都能传引用,但是又保证了数据的不可修改。

然后我们再写List类和迭代器。

迭代器的作用其实就是将容器内容的访问与修改进行包装,使得使用的程序员可以不直接对底层数据进行修改,这样不仅提高了数据的安全性,并且提高了使用者的规范性和代码的可读性。也通过屏蔽底层实现增加了移植性。

首先我们先分析迭代器和List的类的基本成员和模板的使用。

迭代器中实际的成员仍然是我们的原生节点指针,但通过迭代器的包装,就避免了我们直接使用节点,更避免了我们直接操控节点的数据域和指针域,起到多重包装的作用。

List本质是一个对节点操作的工具,所以只需要携带一个size统计数量和锁定头节点(这里是哨兵卫节点)就可以了,本身不携带数据节点的内容。

然后就是分析模板的使用,先对List进行分析。

首先定义出我们的模板T,然后为了实现const迭代器和普通迭代器,正常情况下我们要实现两遍,但是由于存在模板我们可以将这个重复的工作交给编译器。

本质就是通过List<>先锁定T模板是什么类型再通过::域限定符去调用里面的常量迭代器的类模板参数列表并且通过()调用构造函数。

于是我们通过模板实现了两个类型的迭代器,借助编译器进行实现。

理清楚了我们的模板用法,剩下的工作就驾轻就熟了

首先实现插入,这样我们的头插,尾插就可以复用insert了。

同样我们可以先写erase,这样后面头删,尾删就可以复用erase了。

其他实现也非常简单,主要要讲的就是list的析构函数和=的运算符重载。

析构函数就是先清除数据再抹掉头节点即可,没有很大难度。但是一定要分清楚顺序,不要先抹除头节点或者忘记抹除。

运算符重载的写法是现代写法,主要可以方便,形参的lt会被编译器自动回收,而不用自己去操作内存,减少代码量。

然后我们来研究list的构造函数,首先我们要写一个空链表的构造,也就是头节点的构造函数,可以为我们的无参构造和初始化提供方便。那么无参构造就可以直接复用了,而有参构造也可以直接利用其进行头节点的初始化。

当我们完善了List,接下来我们就可以继续完善我们迭代器。

主要就是实现各个运算符的重载,难度不大。

但是我们要注意的是各个重载的返回类型!

首先对于+,-这种移动显然返回类型应该也是相应的迭代器类。

然后就是对迭代器解引用显然就是要获取对应的数据,所以返回的是其数据内容(数据的引用)

而->其实外层会有一个->所以我们实现的时候不能直接把数据内容传出去,而是要返回数据的地址,不然就是错误的。本质可以写出(&(-node->data))->data。

==和!=显然返回bool值就没有其他内容了。

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

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

相关文章

坑爹的奥数(枚举法)

枚举法是一种解决问题的基本方法&#xff0c;它通过列举问题的所有可能情况来找到问题的解。这种方法适用于问题的解空间相对较小&#xff0c;可以通过穷举所有可能的解来找到最优解或满足特定条件的解。 以下是枚举法的一般步骤&#xff1a; 定义问题&#xff1a; 确定问题的…

学习-面试java基础-(集合)

String 为什么不可变&#xff1f; 1线程安全 2支持hash映射和缓存。因为String的hash值经常会使用到&#xff0c;比如作为 Map 的键&#xff0c;不可变的特性使得 hash 值也不会变&#xff0c;不需要重新计算。 3出于安全考虑。网络地址URL、文件路径path、密码通常情况下都是以…

易点易动设备管理系统:助力企业高效巡检的智能选择

在现代企业管理中&#xff0c;设备巡检是确保设备正常运行和生产高效的重要环节。然而&#xff0c;传统的巡检方式常常面临着效率低下、信息不准确等问题。为了解决这些挑战&#xff0c;易点易动设备管理系统应运而生。本文将详细介绍易点易动设备管理系统如何助力企业实现高效…

红队攻防实战之DEATHNOTE

难道向上攀爬的那条路&#xff0c;不是比站在顶峰更让人热血澎湃吗 渗透过程 获取ip 使用Kali中的arp-scan工具扫描探测 端口扫描 可以看到开放了22和80端口。 访问80端口&#xff0c;重定向到 修改hosts文件&#xff0c;将该域名解析到ip 如图 修改完再次访问&#xff0…

Python 递归、闭包与装饰器的编程魔法

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python编程中&#xff0c;递归、闭包和装饰器是一些强大的工具&#xff0c;它们能够为代码增色不少&#xff0c;提高代码的可读性和灵活性。本文将深入探讨这三种编程魔法的原理和应用&#xff0c;通过丰富的示…

040.Python面向对象_设计原则

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

【工具栏】idea安装翻译工具

然后重启idea 打开设置 翻译方式&#xff1a; 选中要翻译的文本 然后右键 运行项目的时候&#xff0c;方便查找错误

快速幂+高精乘(填坑)洛谷1226+1045

引言 最近在刷题的时候偶然见到这样一个题目&#xff0c;见下图 大致的意思是&#xff0c;让我们计算a的b次方取模p的结果&#xff0c;再我了解了关于快速幂的内容之后&#xff0c;很快便解决了这道题&#xff0c;每次乘完a后取模最后就可以得到结果。但是在这之后&#xff0c…

淡化了技术指标 还能做现货黄金交易?

技术指标是分析和预测现货黄金走势的其中一种方法&#xff0c;普通投资者多数依赖技术指标为自己的交易做判断。然而&#xff0c;近几年有一种观点认为&#xff0c;我们应该淡化技术指标&#xff0c;少使用或者不用技术分析来服务我们的交易。这个观点引起了不少投资者的思考&a…

NFTScan | 12.04~12.10 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2023.12.04~ 2023.12.10 NFT Hot News 01/ NFTScan 与 MintCore 联合推出适用于 NFT 的 Layer2 网络 Mint 12 月 5 日&#xff0c;根据官方消息&#xff0c;NFT 基础设施服务商 NFTScan …

Ajax跨域请求

最近使用js构造请求时发生了CORS跨域问题&#xff0c;mark一下 ajax跨域&#xff0c;这应该是最全的解决方案了 | Dailc的个人主页Everything about dailchttps://dailc.github.io/2017/03/22/ajaxCrossDomainSolution.htmlAJAX - 廖雪峰的官方网站研究互联网产品和技术&#…

基于SSM的乡镇篮球队管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本乡镇篮球队管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信…

华为云CodeArts Artifact:保障制品质量与安全的最佳选择

近期&#xff0c;为降低用户使用成本、满足个性化选择诉求&#xff0c;华为云制品仓库CodeArts Artifact 从软件开发生产线 CodeArtS 解耦出来&#xff0c;可单独购买。这是一款打破了传统制品管理的限制&#xff0c;高效、安全、好用的软件包管理工具。 体验通道&#xff1a;…

独热编码和词向量的简单理解

把单词用向量表示&#xff0c;是把深度神经网络语言模型引入自然语言处理领域的一个核心技术。想要让机器理解单词&#xff0c;就必须要把它变成一串数字&#xff08;向量&#xff09;。下面介绍的 One-Hot Encoding&#xff08;One-Hot 编码&#xff09;和 Word Embedding &am…

接口自动化框架Pytest —— 配置文件pytest.ini的详细使用

前言 我们在执行用例的时候&#xff0c;每次都在命令行中输入-v&#xff0c;-s等一些命令行参数的时&#xff0c;比较麻烦。其中pytest.ini这个配置文件可以快速的帮助我们解决这个问题。 配置文件 pytest.ini文件是pytest的主配置文件&#xff0c;可以改变pytest的运行方式…

Async 异步任务注解类的用法及原理分析

背景 看项目源码发现有一个 Async 注解&#xff0c;它是 Spring 的一个注解&#xff0c;作用是在独立的线程中完成注解方法的操作&#xff0c;底层原理是动态代理。 之前不知道这个知识点&#xff0c;小小测试了一下&#xff0c;发现项目中这个注解的用法是错误的&#xff0c…

Cypress安装与使用教程(2)—— 软测大玩家

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

JVM学习笔记-如何在IDEA打印JVM的GC日志信息

若要在Idea上打印JVM相应GC日志&#xff0c;其实只需在Run/Debug Configurations上进行设置即可。 拿《深入Java虚拟机》书中的3-7代码例子来演示&#xff0c;如 1 public class JvmTest {2 private static final int _1MB1024*1024;3 public static void main(String…

AI 技术在前端开发流程中如何应用??3分钟带你一览开放原子开发者大会 OpenTiny 最新资讯!

大会简介 作为开放原子开源基金会的年度盛典&#xff0c;2023 开放原子开发者大会秉持遵循“共建、共治、共享”原则&#xff0c;以“一切为了开发者”为主题。本次大会汇聚顶尖开源人才&#xff0c;共享交流平台&#xff0c;通过吸引和邀请顶尖专家分享见解&#xff0c;设置技…

Leetcode—380.O(1) 时间插入、删除和获取随机元素【中等】

2023每日刷题&#xff08;五十七&#xff09; Leetcode—380.O(1) 时间插入、删除和获取随机元素 算法思想 实现代码 class RandomizedSet { public:vector<int> nums;unordered_map<int, int> dict;RandomizedSet() {srand((unsigned)time(NULL));}bool insert(…