【C++STL】map/set源码封装简单分析

news2024/11/23 13:47:50

文章目录

  • 一. 问题的抛出
  • 二. 红黑树的实现
  • 三. map/set实现
  • 四. 分析
  • 五. KeyOfValue仿函数
  • 结束语

一. 问题的抛出

我们知道C++的STL中map和set的底层都是红黑树。
但是仔细思考一下,map是存储键值对,也就是Key_Value模型
而set是Key的模型
那么STL中的红黑树是如何实现适配这两种不同存储模型的。
我们从源码中,可以获取到我们想知道的答案

在这里插入图片描述

二. 红黑树的实现

我们首先来看一下红黑树结点的实现吧
在这里插入图片描述

可以看到STL中的红黑树结点的设计和我们学习的红黑树的结构大抵相同,只不过STL是使用bool值标记颜色
而且,红黑树的结点存储的只是Value
接下来,我们再看红黑树的类

在这里插入图片描述

我们先了解一下模板参数

Key:Key值
Value:Value值
KeyOfValue:从Value值中分离出Key
Compare:比较器
Alloc:内存池

比较器和内存池和本章内容关系不大,我们不考虑
我们主要要关注前三个参数
同时,我们看到,内部有node结点,但是传入的模板参数是Value,也是一个值。


看到这里,我们发现,STL的红黑树好像没什么特别的,也是存储单值的二叉搜索树,但是map存储的明明是Key_Value,一对键值对,map是如何使用这棵红黑树的呢?

那么接下来,我们就来看一下map和set的源码

三. map/set实现

我们首先查看set的源码

在这里插入图片描述
set的模板参数只有Key,但是我们看到Key被重命名成了两个属性,一个是key_type,一个是value_type,并且分别传入给了红黑树
红黑树的模板参数有一个Key,一个Value,但实际结点存储的只有Value。
接下来,我们将红黑树和set的结构串联

在这里插入图片描述

可以看到红黑树结点中,实际存储的是第二个Key,只是被重命名成了value_type。为什么要这样呢?

我们接下来再看map


在这里插入图片描述
map的模板参数有Key和Value,Key被重命名为key_typeT被重命名为data_type,但是还有一个pair<const Key,T>被命名为value_type,并且传给红黑树的参数是key_type和value_type,也就是Key和pair

我们再将map和红黑树串联

在这里插入图片描述
我们看到,map传给红黑树的是Key和pair,红黑树结点实际存储的是pair,也就是Key_Value,这样就实现了红黑树对map和set的套用了。

四. 分析

看到这,我们好像懂了些什么,但是又好像什么都没懂。
我们先提出一个疑问,红黑树对set和map的适配,好像都是依靠Value,也就是第二个参数,决定了红黑树内存储的是Key还是pair
那Key值的意义是什么呢?
首先,pair存储的是Key和Value。其次,map的个别接口,比如find,erase的参数是Key。同时红黑树要同时适配set和map,所以这些都要有。

五. KeyOfValue仿函数

红黑树的构建有一步非常关键的步骤,那就是结点的比较大小,因为较小的结点要放到左子树中,较大的结点要放到右子树中。红黑树存储的,实际都是map和set传过来的第二个参数,也就是Value。set传的是Key,而map传的pair<const K,V>。红黑树自己不知道上层传过来什么,所以无法直接用Value进行比较,这时就可以通过上层传的KeyOfValue仿函数,得到用来比较的Key了

set传的仿函数,直接返回Key即可
而map穿的仿函数,需要返回pair里的Key
大致实现如下:
在这里插入图片描述

结束语

因为set和map的Key同样不能修改,所以迭代器其实都是const iterator
在这里插入图片描述

本篇文章,仅分析红黑树如何适配set和map,其实二者大部分都是对红黑树的一层封装,然后实现一些操作受限的功能接口。读者可以自行研究,有什么问题也欢迎评论区讨论

本篇内容到此就结束了,感谢你的阅读!

如果有补充或者纠正的地方,欢迎评论区补充,纠错。如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

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

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

相关文章

apisdk-starter自动装配的思路与应用

apisdk-starter整体思路 首先定义开发者定义的开放接口声明为原始类&#xff0c;javassist生成的类是增强类。 使用springboot的EnableAutoConfiguration和Import触发Spring扫描组件扫描原始类&#xff0c;得到所有BeanDefinition拓展FactoryBean&#xff0c;构造函数的参数为…

力扣算题Day20

98.验证二叉搜索树(了解二叉树的性质,才是编写此道题代码的基础) 做题伤着了&#xff1a;这道题我做的时候&#xff0c;看到别人写的代码很长&#xff0c;懒得看&#xff0c;直接干。自己编写代码&#xff0c;没有了解平衡二叉树的性质&#xff0c;然后出现了下图[0,-1]、[0]的…

落地页设计的营销心理学(一)

营销落地页的作用&#xff0c;是为了促进目标用户转化。但如何提升转化率&#xff0c;这就需要我们了解用户在浏览落地页行为背后的动机、心理活动是什么&#xff0c;才能更好地制定营销策略。 营销心理学是指应用心理学原理来解释、预测和影响人们购买决策的一门学科。在落地页…

Goby 漏洞更新 |华视私云-CDN直播加速服务器默认口令漏洞

漏洞名称&#xff1a;华视私云-CDN直播加速服务器默认口令漏洞 English Name&#xff1a;Sinovision Cloud CDN live default passwd CVSS core: 6.5 影响资产数&#xff1a;737 漏洞描述&#xff1a; 华视私云-CDN直播加速服务器是一款用于CDN直播加速的服务器。华视私云…

Restormer Efficient Transformer for High-Resolution Image Restoration论文代码运行记录

文章目录 Restormer代码训练和测试运行记录文章及代码地址1. 所需环境2. 配置环境3. 安装gdrive以便下载数据集4. 放置权重文件5. 运行Demo运行单图像散焦去模糊训练、测试 Restormer代码训练和测试运行记录 文章及代码地址 文章名称&#xff1a;Restormer: Efficient Transf…

获取cookies的方法及使用postman进行接口关联

第一种获取cookies的方式 看有没有专门的登录测试地址&#xff0c;访问来获取cookie信息&#xff0c;然后将cookie信息粘贴到header里面 第二种获取cookies的方式 在登录前&#xff0c;提前打开审查元素&#xff0c;然后输入账号密码后&#xff0c;点击登录&#xff0c;就可…

刚来起薪就18K,公司刚来的00后真是卷王....

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。 这不&#xff0c;前段时间我们公司来了个00后&#xff0c;工作都没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了…

【Java零基础入门篇】第 ⑤ 期 - 抽象类和接口(一)

博主&#xff1a;命运之光 专栏&#xff1a;JAVA入门 学习目标 1.了解什么是抽象类&#xff0c;什么是接口&#xff1b; 2.掌握抽象类和接口的定义方法&#xff1b; 3.理解接口和抽象类的使用场景&#xff1b; 4.掌握多态的含义和用法&#xff1b; 5.掌握内部类的定义方法和使用…

数字孪生应用 | 3D可视化技术助力智慧煤矿建设,提升煤矿生产效率

智慧煤矿数字孪生可视化平台是一种利用现代信息技术手段&#xff0c;对煤矿的生产过程进行实时监测、管理和控制的系统。它能够将煤矿内的数据、信息、图像等多种信息整合在一起&#xff0c;通过3D可视化的方式呈现给煤矿管理者和工作人员&#xff0c;帮助他们更好地了解煤矿的…

mysql读写分离实验

amoeba服务器 mkder amoeba tar xf amoba- mysql-binary-2. 2.0.tar.gz -C amoeba mv amoeba /usr/local 解压jdk mv jdk1.6 /usr/local/jdk1.6 vim /etc/profile export JAVA_home/usr/local/jdk1.6 export CLASSPATH.:$JAVA_HOME/lib:$JAVE_HOME/jre/lib export AM…

SpringBoot+myBatis(plus)+MySQL+VUE最基础简易的前后端全栈demo制作

网站全栈制作&#xff1a; 一&#xff1a;后端 为了跟公司后端更好的扯皮&#xff08;不是&#xff09;&#xff0c;本人决定学一下java语言的后端接口书写。 项目制作&#xff1a;后端采用SpringBootmyBatis(plus)mysql&#xff08;IDE为IDEA软件&#xff09;。前端采用Vue…

奶爸式Swagger教学

目录 一、导入依赖 二、SwaggerConfig基础编程 三、Swagger 常用说明注解 1.API 2.ApiOperation 3.ApiModel 4.ApiModelProperty 5.ApiParam 6.ApilmplicitParam 一、导入依赖 <!--开启Swagger --><!-- https://mvnrepository.com/artifact/io.springf…

自动化测试框架搭建步骤教程

说起自动化测试&#xff0c;我想大家都会有个疑问&#xff0c;要不要做自动化测试&#xff1f; 自动化测试给我们带来的收益是否会超出在建设时所投入的成本&#xff0c;这个嘛别说是我&#xff0c;即便是高手也很难回答&#xff0c;自动化测试的初衷是美好的&#xff0c;而测试…

实验1 流水线及流水线中的冲突【计算机系统结构】

实验1 流水线及流水线中的冲突【计算机系统结构】 前言推荐实验1 流水线及流水线中的冲突1 实验目的2 实验平台3 实验内容和步骤4 实验结论5 实验心得 最后 前言 2023-5-12 20:22:09 以下内容源自《【计算机系统结构】》 仅供学习交流使用 推荐 无 实验1 流水线及流水线中…

【国际知名-hacker`动态`】洞悉-最新 hacker技术 新闻

国际知名-黑客动态 1、【导读】黑客 最新 技术&新闻 平台 2、【动态】每日必看的朋友圈 3、【多看看】跳出舒适圈&#xff0c;你要学的还有很多 ​ The Hacker News 报道黑客攻击、网络安全、科技新闻&#xff08;内容深入浅出>提供及时、可靠的信息) 链接&#xff1a…

面板数据的门槛|门限效应检验、阈值确定、回归结果解释

写在前面 up学习是参照一个B站大美女&#xff1a;传送门 这里做笔记总结&#xff0c;勿cue 1.为什么是门槛模型 这玩意是针对非线性的举个例子 打LOL&#xff0c;最开始接触的时候&#xff0c;是新手训练营&#xff0c;你需要画大量的时间去学习如何行走、控制角色、熟悉英雄…

使用 Selenium IDE 上手 web 自动化测试

安装 Selenium IDE 是以浏览器插件的形式使用的&#xff0c;主要包含 FireFox 和 Chrome 两种。安装方式分为&#xff1a; 在线安装&#xff1a;下载对应的浏览器插件&#xff08;chrome)。本地安装&#xff1a;把 .zip 压缩包拖到浏览器的扩展页面。 开始页面 在浏览器的插…

patchelf 和 glibc-all-in-one

小白垃圾笔记。不建议阅读。 为什么突然学这个呢&#xff1f; 因为因为因为一个栈溢出题&#xff0c;把我的ubuntu16搞崩了。具体是什么原因呢。 我很菜&#xff0c;我不知道pip是干啥的&#xff0c;之前装pwntools都是直接粘贴命令。然而这次&#xff0c;ubuntu16的python其…

冠珠瓷砖打造民族文化品牌,让中国陶成为中国潮

随着国家经济实力、综合国力的大幅度提升&#xff0c;文化自信被强势唤醒&#xff0c;“国潮”之风蔚然复兴。“讲好中国故事、传递中国文化”&#xff0c;成为民族品牌共同的愿景。冠珠瓷砖在建立之初就立足于民族品牌的打造&#xff0c;致力于“砖筑中国瓷砖硬实力”&#xf…

RFID技术在家具行业的应用

RFID技术在家具行业的应用 科技的不断进步和发展&#xff0c;RFID技术在各个领域的应用也越来越广泛&#xff0c;其中家具行业也不例外。RFID技术可以帮助家具企业实现实时追踪、管理和监控家具的生产、物流、库存以及售后服务等全流程&#xff0c;提高家具企业的生产效率和管…