红黑树最典型的应用就是实现C++STL中的map和set;其次还有Java库,Linux内核以及其他的一些内核都是用红黑树实现的 红黑树与AVL树的比较 红黑树与AVL树都是平衡的二叉树: AVL树是严格平衡的,而红黑树是近似平衡的 AVL树和红黑树的查找时间复杂度都是O(log2N) 由于红黑树旋转次数更少,因此在增删过程中性能较优 ...
3) 因为map和set要求是自动排序的,红黑树能够实现这一功能,而且时间复杂度比较低。
1、红黑树的完善 1.1、修改默认成员函数 红黑树中的每个节点都可能开辟独立的内存空间,因此在涉及拷贝、赋值等操作时,默认生成的成员函数已经无法满足需求了 --> 会导致两个指针指向同一块空间,然后造成重复析构问题 所以我们需要对其中的默认成员函数进行改造,手动添加符合要求的默认成员函数 1.1.1、默认构造 写出默...
整理收集的一系列C++的面试题.看完可直接面C++.还不快一键三连收藏起来~~, 视频播放量 1949、弹幕量 0、点赞数 36、投硬币枚数 3、收藏人数 24、转发人数 4, 视频作者 爱做菜的老北鼻, 作者简介 对美食毫无抵抗之力的秃顶程序员...,相关视频:C++中的深拷贝和浅拷贝,C+
一、红黑树及其节点的设计 对于底层都是红黑树的map和set来说,他们之间存在的最大的区别就是:对于set是K模型的容器,而map是KV模型的容器。为了更好的灵活兼容实现map和set,就需要在红黑树以及树节点上进行特别的设计 1、树节点的设计 对于红黑树的节点我们需要节点对于set来说储存key,对于map来说储存key-value键...
在源码里面,对于map和set的实现,底层是用同一棵红黑树封装出来的,并不是用了两棵红黑树,一个红黑树结点存key,一个红黑树结点存<key,value>的键值对,这样的方式太不符合大佬的水准了,实际上在红黑树底层中用了一个模板参数Value来代表红黑树结点存储对象的类型,这个类型可能是pair键值对,也有可能是key类型。
本来我们需要两个红黑树去分别封装map和set,但是代码会有重复、冗余,因此我们采用泛型编程的思想,同一颗红黑树通过传不同的模板参数来分别实现map和set。就是为了复用同一个类模板的红黑树,让代码变的简洁,体现了泛型编程的思想。 比如这里的模板参数T,如果传的是K类型的,代表使用的是set,如果参数传的是pair类型的...
因为map中value是一个pair对象,set中value就是key,它们的获取方式不一样,所以传这个参数是为了实现仿函数,来取出key值用于比较。 那么了解了这个大体的结构之后,下一个就是要实现我们的迭代器了,我们其实可以在红黑树中实现一个树形的迭代器,然后map和set再封装一层就行了,其实我们的迭代器就是一个类,它用来实现...
所以map和set同时封装了红黑树,作为底层实现他们各自的功能的. map中的数据是一个键值对,而set中的数据是值.如何用一个红黑树同时满足两个容器的实现呢.可以想象map和set只是数据不同而大部分内容都是相同的,若为此写两个红黑树代码未免太冗余了,这种情况在之前的学习中实现优先级时遇到过就是通过调节一个仿函数...
map和set的底层原理 C++中的map和set都是STL中的关联容器,都基于红黑树实现。其中set是K模型的容器,而map是KV模型的容器,本文主要讲述用一棵KV模型的红黑树同时实现map和set。map和set都使用红黑树的基本操作,时间复杂度为O(log n),其中n为元素数量。因此,map和set都是高效的关联容器。