C++模拟实现set和map

news2024/11/26 1:37:08

1.看源码,简单了解原码的set和map类的结构

1.看类的私有成员和类模板的参数:

看下面我画的一些框,再结合上面的看一下,会有什么疑惑呢?

一般我们知道编译器底层的代码会很简洁,不会多创建无意义的内容,但是这set的成员变量,竟然传了两个Key给红黑树,这是怎么回事呢?难道是为了和map一样,Key和vlaue来浪费set的一个模板嘛?不确定,我们还是再看一下map是怎么存储的吧。

中间有太多暂时不需要的,我简单删一下:

看到这里应该就明白了,无论是set还是map,编译器都多传了一个key的模板参数给红黑树,这是为什么呢?

其实仔细想想就会明白,比如find函数,我们在红黑树里面怎么定义?如果没有第一个参数模板,那map中find函数应该是bool find(const K& key)那K这个类型怎么来?如果只传pair的话,就无法弄出来了,所以我们就必须传两个参数一个key还有一个是pair类型。

2.最后其实还差一个东西要先了解一下,下面还会详细讲,这边先有一个印象:

那么就剩下我红色框的那个模板类型了,其实这个就是和compare一样的,就是一个仿函数,那这个的作用是什么呢?其实就是map中获取pair中first的key成员,而set这边主要就是陪跑的,为了兼容map而存在的。下面有具体的实现,原码里的还是有点复杂的,现在看没必要。

2.模拟实现map和set

1.模拟实现红黑树

这边作者就不详细讲了,可以看:

1.红黑树的结点:

如果是set的话就是T就是K, 是map的话,T就是pair<K, V>.

这边Color其实一个枚举,方便表示罢了。

2.红黑树的主体部分

作者这边只模拟实现了前三个模板参数

2.下面是成员函数:

2.封装map和set

1.set

1.可以先讲一下迭代器,无所谓的,值得注意set的迭代器是iterator和const_iterator其实都是const_iterator迭代器,这就是追究到set的key本来就不支持修改,不然就破坏了红黑树的结构了。

2.map

这个也一样,map中的key是不允许改变的,而value是允许改变的,所以我们可以将key const化就可以达到目的了。

3.实现迭代器

这个就和list迭代器差不多了,创建一个迭代的类,然后慢慢实现迭代的内容:

最难的operator++和--看一下我的函数,画一个图就差不多能理解了,我这边的end函数就是nullptr来结束的,但是源码其实还复杂一点,就是在红黑树的头加了一个header的指针,加了的话,那红黑的插入和删除也要重新改结构,我们模拟只是大概理解底层的实现原理,作者这边就不实现啦,感兴趣的同学可以自行的再去研究研究。

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

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

相关文章

【使用教程】在Ubuntu下PMM60系列一体化伺服电机通过PDO跑循环同步位置模式详解

本教程将指导您在Ubuntu操作系统下使用PDO来配置和控制PMM60系列一体化伺服电机以实现循环同步位置模式。我们将介绍必要的步骤和命令&#xff0c;以确保您能够成功地配置和控制PMM系列一体化伺服电机。 一、准备工作 在正式介绍之前还需要一些准备工作&#xff1a;1.装有lin…

环保壁炉:酒精壁炉的生态优势

环保已经成为一个备受重视的话题。我们都希望采用更环保的能源&#xff0c;以减少对地球的影响。而酒精壁炉作为一种新型的取暖方式&#xff0c;正受到越来越多人的喜爱&#xff0c;因为它们代表了一种清洁能源的选择。 酒精壁炉的独特之处在于它们使用酒精作为燃料。这种酒精…

NFT数字藏品(交易平台)系统开发

随着数字技术和区块链技术的发展&#xff0c;NFT数字藏品交易平台系统开发逐渐成为了一个热门话题。NFT&#xff0c;即非同质化代币&#xff0c;可以用来代表独一无二的数字资产&#xff0c;如图片、音频、视频等&#xff0c;在数字世界中具有极高的价值。本文将介绍NFT数字藏品…

11.10论文写作与格式

格式 文章题目&#xff1a;&#xff08;三号、黑体、加粗&#xff0c;居中&#xff09; 摘要&#xff1a;这两个大字要&#xff08;黑体、小四、加粗&#xff0c;左对齐&#xff09;&#xff1b;内容为(宋体、小四) 关键词&#xff1a;三个字为(黑体、小四、加粗&#xff0c…

动作捕捉系统通过SDK与LabVIEW通信

运动分析、VR、机器人等应用中常使用LabVIEW对动作捕捉数据进行实时解算。NOKOV度量动作捕捉系统支持通过SDK与LabVIEW进行通信&#xff0c;将动作数据传入LabVIEW。 一、软件设置 1、形影软件设置 1、将模式切换到后处理模式 2、加载一个刚体数据 3、打开软件设置 4、选择网…

NFT Insider112:Gucci Cosmos LAND亮相 The Sandbox,和YGG一起探索Web3增长新方式

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members(https://twitter.com/WHALEMembers)、BeepCrypto&#xff08;https://twitter.com/beep_crypto&#xff09;联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周…

实现智慧工地的高效建筑管理,数据分析起着关键作用!

智慧工地是利用物联网、云计算、大数据等技术&#xff0c;实现对建筑工地实时监测、管理和控制的一种新型建筑管理方式。 智慧工地架构&#xff1a; 1、终端层&#xff1a;充分利用物联网技术、移动应用、智能硬件设备提高现场管控能力。通过RFID、传感器、摄像头、手机等终端…

KiB、MiB与KB、MB的区别

KiB、MiB与KB、MB的区别

vue3 + antd 图片上传 (精简篇)cv即可

使用antd组件库里的 a-upload 上传图片 template代码&#xff1a; <a-upload name"idCardzm" list-type"picture-card" class"avatar-uploader" :show-upload-list"false":before-upload"beforeUpload" :customRequest…

喜报!华为云金融PaaS3.0荣获“2023年应用现代化典型案例”称号

中国软件行业协会近期启动了2023“应用现代化产业实践”优秀案例征集活动&#xff0c;旨在加快推动应用现代化发展与推广应用&#xff0c;形成行业应用带动和示范作用&#xff0c;打造应用现代化软件名企、名品&#xff0c;凝聚行业资源&#xff0c;助力我国行业应用现代化高质…

mac使用VMware Fusion安装Centos 7系统

mac主机芯片&#xff1a;Apple M2 Pro VMware-Fusion&#xff1a;13.5 centos&#xff1a;7 第一次操作&#xff1a; 按步骤选择操作系统 在选择虚拟启动虚拟机没有安装centos的界面 而是下图 改动&#xff1a;把UEFI换成BIOS ——>无果 第二次操作&#xff1a; 直接…

国际阿里云:无法ping通ECS实例公网IP的排查方法!!!

无法ping通ECS实例的原因较多&#xff0c;您可以参考本文进行排查。 问题现象 本地客户端无法ping通目标ECS实例公网IP&#xff0c;例如&#xff1a; 本地客户端为Linux系统&#xff0c;ping目标ECS实例公网IP时无响应&#xff0c;如下所示&#xff1a; 本地客户端为Windo…

实时疫情地图及全国监测动态大屏可视化【可视化项目案例-02】

🎉🎊🎉 你的技术旅程将在这里启航! 🚀🚀 本文选自专栏:可视化技术专栏100例 可视化技术专栏100例,包括但不限于大屏可视化、图表可视化等等。订阅专栏用户在文章底部可下载对应案例源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不…

【poi导出excel模板——通过建造者模式+策略模式+函数式接口实现】

poi导出excel模板——通过建造者模式策略模式函数式接口实现 poi导出excel示例优化思路代码实现补充建造者模式策略模式 poi导出excel示例 首先我们现看一下poi如何导出excel&#xff0c;这里举个例子&#xff1a;目前想要导出一个Map<sex,List>信息&#xff0c;sex作为…

竞赛选题 深度学习疲劳驾驶检测 opencv python

文章目录 0 前言1 课题背景2 实现目标3 当前市面上疲劳驾驶检测的方法4 相关数据集5 基于头部姿态的驾驶疲劳检测5.1 如何确定疲劳状态5.2 算法步骤5.3 打瞌睡判断 6 基于CNN与SVM的疲劳检测方法6.1 网络结构6.2 疲劳图像分类训练6.3 训练结果 7 最后 0 前言 &#x1f525; 优…

RFID智慧物流设计解决方案

物流行业需求 物流是将物质资料从供应者运送到需求者的物理运动过程&#xff0c;涉及运输、保管、包装、装卸、流通加工、配送以及信息等多个基本活动的统一整合&#xff0c;在经济全球化和电子商务的推动下&#xff0c;快递物流和医药物流成为现代物流的两大重要产业。随着智…

Python编程——模块、包和__init__.py

1. 模块 Python中的一个文件即为一个模块(Module)&#xff0c;一个模块引用另外一个模块的变量、函数或类时&#xff0c;使用import来导入。模块名即文件名。 如fibo.py 文件下有如下代码&#xff1a; def fib(n): # write Fibonacci series up to na, b 0, 1while a <…

(五)Spring源码解析:ApplicationContext解析

一、概述 1.1> 整体概览 在前面的内容中&#xff0c;我们针对BeanFactory进行了深度的分析。那么&#xff0c;下面我们将针对BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与BeanFactory的功能相似&#xff0c;都是用于向IOC中加载Bean的。…

我的月光宝盒初体验失败了

哈哈哈&#xff0c;我爱docker, docker 使我自由&#xff01;&#xff01;&#xff01; docker make me free! 菠萝菠萝蜜口号喊起来。 https://github.com/vivo/MoonBox/ windows上安装好了docker之后&#xff0c;docker-compose是自带的。 docker-compose -f docker-compo…

收单外包机构评级等级为何获D、E级及其影响分析

孟凡富 中国支付清算协会发布2022年度收单外包服务机构评级等级。本次评级工作&#xff0c;共有包括银行和非银行支付机构在内的134家收单机构对13000家外包机构进行了评价&#xff0c;参评外包机构数量较上一年度增长35.59%&#xff0c;评级工作覆盖面继续扩大。评级等级在C级…