[C++][数据结构]用红黑树封装map和set(包含红黑树迭代器)

引入

官方文档中,我们可以看到map和set都是用一个红黑树来实现的,那set不给出value、map给出了value,这两个不一样,是如何用一个红黑树来实现的呢?

基本结构

节点的定义

代码中,将pair换成了data

template<class T>
struct RBTreeNode`在这里插入代码片`
{RBTreeNode<T>* _left;RBTreeNode<T>* _right;RBTreeNode<T>* _parent;Colour _col;T _data;RBTreeNode(const T& data):_left(nullptr), _right(nullptr), _parent(nullptr), _data(data), _col(RED){}
};

树的修改

然后将树的模板参数修改了一下

// KeyOfT:lambda/仿函数 取出T对象中的key
template<class K, class T, class KeyOfT>
  • K是key(用于查找)
  • T是data
  • KeyOfT是取出T中key的lambda(后面在比较key的时候会用到)

那么set和map的实现其实这样的

 set->RBTree<K, K, SetKeyOfT>map->RBTree<K, pair<K, V>, MapKeyOfT>

所以就是通过第二个参数来控制给出的是set还是map了

迭代器

源码给出的迭代器:
在这里插入图片描述本质上还是根据给出的data是pair<K, V>还是value来判断生成哪种指针

先看一些老生常谈的内容吧
operator* -> != ==

template<class T>
struct RBTreeIterator
{using Node = RBTreeNode<T>;using Self = RBTreeIterator<T>;Node* _node;RBTreeIterator(Node* node):_node(node){}T& operator*(){return _node->_data;}T* operator->(){return &_node->_data;}bool operator!=(const Self& s){return _node != s._node;}bool operato == (const Self & s){return _node == s._node;}
};

需要说明的是节点的++和–

++

并不是对于data的value++
而是该节点的后继节点

  • 如果节点有右子树,则节点的后继节点是其右子树中最左边的节点。
  • 如果节点没有右子树,那么就向上找父节点,直到找到一个节点,它是其父节点的左子节点,这个父节点就是要找的前驱节点。
Self& operator++(){if (_node->_right){// 右子树的中序第一个(最左节点)Node* subLeft = _node->_right;while (subLeft->_left){subLeft = subLeft->_left;}_node = subLeft;}else{// 祖先里面孩子是父亲左的那个Node* cur = _node;Node* parent = cur->_parent;while (parent && cur == parent->_right){cur = parent;parent = cur->_parent;}_node = parent;}return *this;}

–就是该节点的前驱节点

  • 如果节点有左子树,则节点的前驱节点是其左子树中最右边的节点。
  • 如果节点没有左子树,那么就向上找父节点,直到找到一个节点,它是其父节点的右子节点,这个父节点就是要找的前驱节点。
    (找的方法一样,只不过左右换了一下)

比较

我们不能用data直接进行比较,因为set里data是value,map里data是pair。
所以,我们需要将data中的key取出来,再进行比较
(可以用仿函数、lambda)
我们用lambda(当然,也会给出仿函数的代码)

lambda

代码如下

// 使用 Lambda 表达式作为键值提取器
auto keyOfT = [](const T& obj) { return obj.key; };// 使用模板并传入 Lambda 表达式作为参数
RBTree<int, MyClass, decltype(keyOfT)> tree;

那么在调用的时候就直接在类里写

KeyOfT kot;
if(kot(node->_data) < kot(data)
{}

operator()

struct KeyOfT {template <typename T>const K& operator()(const T& obj) const {return obj.key;}
};

结语

那么对于map和set的介绍到这里就结束了,希望你有所收获,我们下次见~~

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读:Real-Time 3D Model Acquisition

前言&#xff1a; 本文为记录自己在NeRF学习道路的一些笔记&#xff0c;包括对论文以及其代码的思考内容。 小编目前在探索3DAIGC和3D打印交叉研究&#xff0c;在这方面有想法、经验的朋友都可以在b站留言交流下&#xff01;欢迎&#xff01; 公众号&#xff1a; AI知识物语…

刷题第3天(中等题):LeetCode24--两两交换链表中的节点--递归法

LeetCode24&#xff1a; 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4…

深度学习笔记001

目录 一、批量规范化 二、残差网络ResNet 三、稠密连接网络&#xff08;DenseNet&#xff09; 四、循环神经网络 五、信息论 六、梯度截断 本篇blog仅仅是本人在学习《动手学深度学习 Pytorch版》一书中做的一些笔记&#xff0c;感兴趣的读者可以去官网http://zh.gluon.a…

Ubuntu22.04下安装kafka_2.12-2.6.0并运行简单实例

目录 一、版本信息 二、安装Kafka 1. 将Kafka安装包移到下载目录中 2. 安装Kafka并确保hadoop用户对Kafka目录有操作权限 三、启动Kafka并测试Kafka是否正常工作 1. 启动Kafka 2. 测试Kafka是否正常工作 一、版本信息 虚拟机产品&#xff1a;VMware Workstation 17 Pro…

python 中如何匹配字符串

python 中如何匹配字符串&#xff1f; 1. re.match 尝试从字符串的起始位置匹配一个模式&#xff0c;如果不是起始位置匹配成功的话&#xff0c;match()就返回none。 import re line"this hdr-biz 123 model server 456" patternr"123" matchObj re.matc…

版本控制工具之Git的基础使用教程

Git Git是一个分布式版本控制系统&#xff0c;由Linux之父Linus Torvalds 开发。它既可以用来管理和追踪计算机文件的变化&#xff0c;也是开发者协作编写代码的工具。 本文将介绍 Git 的基础原理、用法、操作等内容。 一、基础概念 1.1 版本控制系统 版本控制系统&#x…

攻略:ChatGPT3.5~4.0(中文版)国内无限制免费版(附网址)【2024年5月最新更新】

一、什么是ChatGPT&#xff1f; 1、ChatGPT的全名是Chat Generative Pre-trained Transformer&#xff0c;其中"chat"表示聊天。"GPT"则是由三部分组成&#xff1a;生成式&#xff08;generative&#xff09;意味着具有创造力&#xff1b;预训练&#xff0…

1802907-91-0,甲基四嗪PEG4羧酸一种胺反应试剂

基本信息&#xff1a; 中文名称&#xff1a;甲基四嗪-四聚乙二醇-羧基&#xff0c;甲基四嗪PEG4羧酸 英文名称&#xff1a;Methyltetrazine-PEG4-acid&#xff0c;Methyltetrazine-PEG4-COOH CAS号&#xff1a;1802907-91-0 分子式&#xff1a;C20H28N4O7 分子量&#xff…

漫威争锋Marvel Rivals申请测试资格教程 最新获取测试资格教程

即将震撼登场的《漫威争锋》&#xff08;Marvel Rivals&#xff09;标志着PvP射击游戏领域的全新突破&#xff0c;由漫威官方网站全力支持推出。这款游戏定于5月11日早晨9点启幕其封闭Alpha测试章节&#xff0c;这场测试盛宴将持续整整十天。在首波测试浪潮中&#xff0c;玩家有…

【算法】滑动窗口——水果成篮

本篇博客是我对“水果成篮”这道题由暴力解法到滑动窗口思路的具体思路&#xff0c;有需要借鉴即可。 目录 1.题目2.暴力求解3.暴力优化3.1每次right不用回退3.2有些left长度一定不如前一个&#xff0c;不用走&#xff0c;left不回退 4.滑动窗口算法5.总结 1.题目 题目链接&am…

什么是静态住宅代理IP?

静态住宅代理&#xff08;也称为静态ISP代理&#xff09;是最流行的代理类型之一。它们也是隐藏您的身份并保持在线匿名的最佳方法之一。您为什么要使用住宅代理而不是仅使用常规代理服务&#xff1f;下面我具体分享。 一、什么是静态住宅代理&#xff1f; 首先&#xff0c;我…

BI赋能金融新质生产力,16家金融机构智能BI创新实践分享

2024年政府工作报告强调&#xff0c;要“大力发展科技金融、绿色金融、普惠金融、养老金融、数字金融”&#xff0c;同时“大力推进现代化产业体系建设&#xff0c;加快发展新质生产力”。对于金融行业而言&#xff0c;培育新质生产力是高质量发展的关键着力点。金融机构可以通…