当前位置: 首页 > article >正文

【c++】set和map的封装

一、框架搭建 如何实现红黑树的复用set和map的底层都是红黑树但由于存储元素的差异一个只存储key一个既存储key又存储value我们要么创造出两棵稍微不一样的红黑树或者是改变红黑树的结构使其能完美匹配上set和map。库里面采用了后者。1. 分析库里set与map的实现分析RBTree的两个模板参数 Key, Value库里面RBTree的实现一共有5个模板参数分别是 KeyValueKeyOfValueCompare和Alloc我们主要分析前三个模板参数的作用。Compare是控制比较规则的仿函数类型Alloc是内存池。在这里插入图片描述对于set它只有一个用来接收key类型的模板参数Key并把Key同一个类型命名为key_type与value_type。对于map它有两个分别用来接收key和 value类型的模板参数Key和T。将Key重命名为key_type将pairconst Key, T 重命名为value_type。它们复用同一棵红黑树将4个类型传给红黑树。在这里插入图片描述重点观察Value这个模板参数它的类型是节点所存储的元素的类型。set传过来的是Key类型map传过来的是pairconst Key, T类型。利用模板来控制红黑树所存储的类型满足set和map不同的存储需求。在这里插入图片描述我们传递给map的只是key和value的类型而map要存储的是pairconst key, value类型实现key和value的绑定const实现不可修改以后再加所以我们需要做一个加工。既然有了接收存储元素类型的Value类型而为什么不删除第一个用来单独存储key类型的模板参数Key似乎用不上它这个以后就能知道了。2. 分析第三个模板参数KeyofValue我们在进行插入时需要根据key的大小来找到插入的位置而由于set和map存储类型的不同set直接用Valuekey类型的元素就好而map则需要取出Value(pairconst key, value)里面的key值来找到插入的位置。在这里插入图片描述而KeyOfValue这个模板参数就是用来接收功能为取出key的仿函数类型KeyOfValue是匿名对象。可以参照库里的实现大胆猜测。在这里插入图片描述set里面传给KeyOfValue的是一个ideneityvalue_type类型的仿函数identity在这里是本身的意思它的功能就是取出key值就是value_type类型的元素它本身而map里面传给KeyOfValue的是一个select1stvalue_type类型的仿函数它的功能就是取出key值就是value_type类型元素里的第一个值。在这里插入图片描述所以我们在set和map里面的实现里面都要实现一个仿函数用来传递给KeyOfValue。set代码语言javascriptAI代码解释namespace mosheng { templateclass K class identity { public: K operator()(const K key) { return key; } }; templateclass Key class set { typedef RBTreeKey, Key, identityKey rbType; }; }map:代码语言javascriptAI代码解释namespace mosheng { templateclass K, class KV class select1st { public: K operator()(const KV kv) { return kv.first; } }; templateclass Key, class Value class map { typedef RBTreeKey, std::pairKey, Value, select1stKey, std::pairKey, Value rbType; }; }不要忘了对应的红黑树的修改主要是修改insert和find还有对应的模板参数去用KeyOfValue提取key。然后框架搭建完毕。代码语言javascriptAI代码解释#pragma once enum Colour { RED, BLACK }; templateclass Value struct RBTreeNode { RBTreeNode(Value kv) :_kv(kv) , _left(nullptr) , _right(nullptr) , _parent(nullptr) { }; Value _kv; RBTreeNodeValue* _left; RBTreeNodeValue* _right; RBTreeNodeValue* _parent; Colour _col RED; }; templateclass Key, class Value, class KeyOfValue class RBTree { typedef RBTreeNodeValue Node; public: bool Insert(Value kv) { //处理空树的情况 if (_root nullptr) { _root new Node(kv); _root-_col BLACK; return true; } //找到要插入的位置 else { Node* cur _root; Node* parent nullptr; while (cur) { if (KeyOfValue()(kv) KeyOfValue()(cur-_kv)) { parent cur; cur cur-_left; } else if (KeyOfValue()(kv) KeyOfValue()(cur-_kv)) { parent cur; cur cur-_right; } else { return false; } } //插入新节点 cur new Node(kv); if (KeyOfValue()(parent-_kv) KeyOfValue()(kv)) { parent-_left cur; } else { parent-_right cur; } cur-_parent parent; //父节点为红色的情况下需要进行处理 if (parent-_col RED) { while (parent parent-_col RED) { //记录节点 Node* grandfather parent-_parent; Node* uncle nullptr; if (grandfather-_left parent) { uncle grandfather-_right; } else { uncle grandfather-_left; } //uncle为红色的情况 //仅变色 if (uncle uncle-_col RED) { uncle-_col parent-_col BLACK; grandfather-_col RED; //更新 cur grandfather; parent cur-_parent; } //uncle为黑色或为空的情况 else { //右旋转 if (grandfather-_left parent parent-_left cur) { RotateR(grandfather); parent-_col BLACK; grandfather-_col RED; break; } //左旋转 else if (grandfather-_right parent parent-_right cur) { RotateL(grandfather); parent-_col BLACK; grandfather-_col RED; break; }//左右双旋 else if (grandfather-_left parent parent-_right cur) { RotateL(parent); RotateR(grandfather); cur-_col BLACK; grandfather-_col RED; break; } //右左双旋 else { RotateR(parent); RotateL(grandfather); cur-_col BLACK; grandfather-_col RED; break; } } } } } //处理根节点颜色 _root-_col BLACK; return true; } void InOrder() { _InOrder(_root); cout endl; } Node* Find(const Key key) { Node* cur _root; while (cur) { if (KeyOfValue()(cur-_kv) key) { cur cur-_right; } else if (KeyOfValue()(cur-_kv) key) { cur cur-_left; } else { return cur; } } return nullptr; } Node* _root nullptr; };可以使用匿名对象但推荐构造一个对象kof来使用仿函数KefOfValue。为什么保留第一个Key的模板参数在find函数上就有所体现我们需要Key的类型因为要根据Key的类型来寻找。KefOfValue无法提取出类型。二、迭代器的实现迭代器的实现也就是在节点指针的基础之上做封装操作并重载一些运算符。map和set的迭代器是双向迭代器关键是需要实现和–的重载。1. 普通迭代器iterator的实现1.1 先搭一个基本框架代码语言javascriptAI代码解释templateclass Value class TreeIterator { typedef RBTreeNodeValue Node; typedef TreeIteratorValue Self; public: TreeIterator(Node* node) :_node(node) {} Value operator* () { return _node-_kv; } Value* operator-() { return (_node-_kv); } bool operator(const Self s)const { return _node s-_node; } bool operator!(const Self s)const { return _node ! s-_node; } private: Node* _node; };1.2 operator与operator- -实现operator我们希望达成的效果是从当前节点移动到下一个按照中序遍历的节点。- -则是反过来。只需要知道当前节点的下一个节点是哪一个。在这里插入图片描述现在我们有一棵红黑树若当前节点为18那么我们希望节点18后的节点是节点25节点25后的节点是节点30以此类推。首先看节点10它不是叶子节点后需要跳到节点15也就是它的右节点这是因为它的右子树不为空按照中序遍历顺序可以认为它的左子树是遍历完成的只需要看它的右子树就行。所以首先要判断当前节点的右子树是否为空。再来看节点30后需要跳到节点35是其右子树的最左节点。若不为空就会跳到节点30的左孩子节点40节点40的左子树是还未访问过的所以需要访问它的左子树一直到最左端。

相关文章:

【c++】set和map的封装

一、框架搭建( 如何实现红黑树的复用?)set和map的底层都是红黑树,但由于存储元素的差异(一个只存储key,一个既存储key又存储value),我们要么创造出两棵稍微不一样的红黑树&#xff0…...

[vscode]修改环境变量,更新包之后,vscode不生效解决

解决办法: 1.重启计算机 2.退出vscode,并且在WinR打开命令行,在命令行输入code重新打开vscode即可生效...

AI提示词仓库:提升开发者与AI编程助手协作效率的实战指南

1. 项目概述:一个为开发者准备的AI提示词宝库如果你和我一样,每天都在和Cursor、GitHub Copilot这类AI编程助手打交道,那你肯定也经历过这样的时刻:面对一个新项目,你希望AI能理解你的代码规范、项目架构,甚…...

Neo 构建鸿蒙应用【三】:实战社交应用与工程感悟

Neo 构建鸿蒙应用【三】:实战社交应用与工程感悟 Neo 框架连载(终篇) AI 辅助撰写 前两篇讲完了架构和机制。这一篇换个角度——不谈概念,只看代码。用一个模拟 Soul 业务场景的社交应用完整实现,验证框架在真实项目中…...

终极指南:如何5分钟搞定MASA模组全家桶中文汉化,让Minecraft技术模组不再有语言障碍

终极指南:如何5分钟搞定MASA模组全家桶中文汉化,让Minecraft技术模组不再有语言障碍 【免费下载链接】masa-mods-chinese 一个masa mods的汉化资源包 项目地址: https://gitcode.com/gh_mirrors/ma/masa-mods-chinese 还在为Minecraft中复杂的英文…...

OmenSuperHub:基于WMI BIOS控制的游戏本硬件管理框架

OmenSuperHub:基于WMI BIOS控制的游戏本硬件管理框架 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度,自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub OmenSuperHub是一个针对惠普OMEN系列游戏…...

Pandapower电力系统分析完全指南:5步快速掌握潮流计算与电网建模

Pandapower电力系统分析完全指南:5步快速掌握潮流计算与电网建模 【免费下载链接】pandapower Convenient Power System Modelling and Analysis based on PYPOWER and pandas 项目地址: https://gitcode.com/gh_mirrors/pa/pandapower Pandapower是一个基于…...

从文件上传到API输出:一个完整ABAP JSON处理流程实战(含GUI_UPLOAD和字段映射)

从文件上传到API输出:ABAP JSON全流程开发实战 想象一下这个场景:人力资源部门需要将员工兴趣调查的JSON文件导入SAP系统,经过处理后生成符合外部培训系统要求的JSON格式。作为ABAP开发者,你需要构建一个端到端的解决方案——这正…...

Unity开发者效率翻倍:用Odin插件5分钟搞定自定义Inspector(附常用Attribute速查表)

Unity开发者效率翻倍:用Odin插件5分钟搞定自定义Inspector(附常用Attribute速查表) 如果你是一名Unity开发者,每天都要面对枯燥的Inspector面板,为策划和美术同事反复修改数据配置界面,那么Odin插件将成为你…...

别再只看LIDT数值了!选高功率激光镜片,这3个隐藏坑点新手必看

高功率激光镜片选购指南:超越LIDT数值的三大实战陷阱 当你面对供应商提供的激光损伤阈值(LIDT)数据时,是否曾疑惑为什么相同标称参数的光学元件在实际使用中表现天差地别?在激光加工设备突然停机检修的混乱现场,或是科研实验因光学…...

为什么92%的C++团队在C++27模块迁移中失败?——头部车企/航天院所模块化落地复盘报告(限内部技术委员会解密版)

更多请点击: https://intelliparadigm.com 第一章:C27模块系统工程化部署教程 C27 模块系统在标准化进程中显著强化了模块接口稳定性、跨编译器可移植性与构建缓存友好性。工程化部署需兼顾模块分区、依赖解析策略及增量构建支持,而非仅满足…...

大语言模型角色扮演技术:从提示工程到多智能体模拟的实践指南

1. 角色扮演大语言模型:从概念到实践的全景解析如果你最近关注AI领域,尤其是大语言模型的应用,那么“角色扮演”这个词你一定不陌生。它不再是游戏玩家的专属,而是成为了衡量和拓展大语言模型能力的一个关键维度。简单来说&#x…...

扩散模型噪声偏移问题与噪声感知引导技术解析

1. 噪声偏移问题的本质与影响 扩散模型在图像生成领域展现出惊人潜力,但其核心采样过程存在一个关键挑战——噪声偏移(Noise Drift)。这种现象表现为:在反向去噪过程中,预测噪声与实际注入噪声之间出现系统性偏差&…...

扩散模型噪声偏移问题解析与优化实践

1. 扩散模型中的噪声偏移现象解析在图像生成领域,扩散模型近年来展现出惊人的创造力。但实际操作中,许多开发者都会遇到一个棘手问题——生成图像出现色彩偏差、细节模糊或结构扭曲。这些现象往往源于噪声预测环节的系统性误差,我们称之为&qu…...

当Minecraft遇到中文:MASA模组汉化包带你告别英文界面焦虑

当Minecraft遇到中文:MASA模组汉化包带你告别英文界面焦虑 【免费下载链接】masa-mods-chinese 一个masa mods的汉化资源包 项目地址: https://gitcode.com/gh_mirrors/ma/masa-mods-chinese 想象一下这样的场景:你在Minecraft中建造着宏伟的城堡…...

终极AI视频补帧指南:如何用Squirrel-RIFE让普通视频秒变流畅大片?

终极AI视频补帧指南:如何用Squirrel-RIFE让普通视频秒变流畅大片? 【免费下载链接】Squirrel-RIFE 效果更好的补帧软件,显存占用更小,是DAIN速度的10-25倍,包含抽帧处理,去除动漫卡顿感 项目地址: https:…...

MuseTalk 1.5技术解析:如何实现实时高质量唇形同步的三大突破

MuseTalk 1.5技术解析:如何实现实时高质量唇形同步的三大突破 【免费下载链接】MuseTalk MuseTalk: Real-Time High Quality Lip Synchorization with Latent Space Inpainting 项目地址: https://gitcode.com/gh_mirrors/mu/MuseTalk 在AI驱动的虚拟人技术领…...

告别等待!3步掌握PicAComic漫画下载器,批量下载速度提升500%

告别等待!3步掌握PicAComic漫画下载器,批量下载速度提升500% 【免费下载链接】picacomic-downloader 哔咔漫画 picacomic pica漫画 bika漫画 PicACG 多线程下载器,带图形界面 带收藏夹,已打包exe 下载速度飞快 项目地址: https:…...

OpenMemories-Tweak:索尼相机限制解除终极指南,解锁隐藏功能

OpenMemories-Tweak:索尼相机限制解除终极指南,解锁隐藏功能 【免费下载链接】OpenMemories-Tweak Unlock your Sony cameras settings 项目地址: https://gitcode.com/gh_mirrors/op/OpenMemories-Tweak 你是否曾经因为索尼相机的录制时间限制而…...

本地AI应用框架py-gpt:从模型集成到知识库构建的完整指南

1. 项目概述:一个能“思考”的本地AI应用框架最近在折腾本地AI应用开发的朋友,可能都绕不开一个核心痛点:如何让大语言模型(LLM)不仅仅是“聊天”,而是能真正融入你的工作流,成为你的智能助手、…...

DevSpace:云原生开发内循环加速器,告别K8s开发低效循环

1. 为什么我们需要 DevSpace?一个云原生开发者的自白如果你和我一样,每天都在和 Kubernetes、Docker、微服务打交道,那你一定对下面这个循环深恶痛绝:改几行代码 ->docker build->docker push-> 更新kubectl部署 -> 等…...

WindowResizer:3分钟学会强制调整任意窗口大小的终极解决方案

WindowResizer:3分钟学会强制调整任意窗口大小的终极解决方案 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 你是否曾经被那些固执的Windows窗口折磨过?老…...

【企业级低代码平台落地白皮书】:基于.NET 9构建可审计、可扩展、可热更新的组件生态(含GDPR合规模板)

更多请点击: https://intelliparadigm.com 第一章:企业级低代码平台组件开发概述 企业级低代码平台的核心竞争力之一,在于其可扩展、可复用、可治理的自定义组件生态。与消费级工具不同,企业场景要求组件具备强类型约束、运行时沙…...

手把手教你用Python下载B站4K大会员视频:开源工具bilibili-downloader完全指南

手把手教你用Python下载B站4K大会员视频:开源工具bilibili-downloader完全指南 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader …...

机器学习中的不确定性量化与应用实践

1. 不确定性在机器学习中的核心地位在真实世界的机器学习应用中,我们常常会遇到模型预测结果与实际情况不符的情况。这种差异并非总是源于代码错误或数据错误,更多时候是系统固有的不确定性在起作用。理解这种不确定性,对于构建可靠的机器学习…...

终极指南:如何彻底移除Windows Defender并提升系统性能30%

终极指南:如何彻底移除Windows Defender并提升系统性能30% 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mirrors…...

5分钟搞定Masa Mods中文汉化:告别英文困扰,畅享原生中文体验

5分钟搞定Masa Mods中文汉化:告别英文困扰,畅享原生中文体验 【免费下载链接】masa-mods-chinese 一个masa mods的汉化资源包 项目地址: https://gitcode.com/gh_mirrors/ma/masa-mods-chinese 还在为Masa Mods复杂的英文界面头疼吗?每…...

如何在 WSL-Ubuntu 上安装 CUDA ?

0. 查看自己的Ubuntu系统版本和架构 在开始下载CUDA之前,有一个前置步骤,那就是确定自己的WSL-Ubuntu的版本和架构。 通过 lsb_release -a 命令可以查看Ubuntu的版本信息。系统会返回如下输出: Distributor ID: Ubuntu Description: Ubun…...

观测Taotoken平台API调用的延迟与稳定性体感分享

观测Taotoken平台API调用的延迟与稳定性体感分享 1. 多模型服务的响应体验 在日常开发中持续调用Taotoken平台提供的多模型服务时,最直接的体感是不同模型之间的响应速度存在自然差异。例如,调用Claude系列模型完成文本生成任务时,从发送请…...

谷歌联手推出 AI UI 神器,狂揽 68000+ Star!

AI 编程工具在写代码这件事上已经越来越溜,但让它生成 UI 界面时,大家很快就发现一个头疼的问题。明明给了需求,AI 也确实把页面做出来了,可看着总觉得哪里不对劲。要么配色诡异,要么间距混乱,要么字体看着…...