c++ multimap是红黑树还是什么?
一、c++ multimap是红黑树还是什么
C++标准并未硬性规定multimap必须使用哪种数据结构,只是对其特性有所要求,比如容器内元素必须有序,查找删除时间复杂度得是对数级等等。 而红黑树确实非常适合用于这种场景,所以主流的STL版本都采用红黑树来实现multimap。 事实上如果你喜欢也可以自己用AVL树或者甚至都不需要平衡二叉树,比如skiplist就是个不错的选择,来实现multimap。这些都是符合C++标准规定的。
红黑树(RB-Tree)—map,set,multimap,multiset底层使用红黑树
Red-Black tree(红黑树)是平衡二分搜索树(balanced binary search tree)中常被使用的一种。平衡二分搜索树的特性:排列规则有利search和insert,并保持适度平衡—无任何结点过深。
RB-Tree提供遍历操作及iterators。
按正常规则(++ite)遍历,便能获得排序状态(sorted)。
我们不应该使用RB-Tree的iterators改变元素值(因为元素有其严谨的排列规则)。变成层面并未阻止此事。如此设计是正确的,因为RB-Tree即将为set何map服务(作为其底层支持),而map允许元素的data被改变,只有元素的key才是不可被改变的。
RB-Tree提供两种insertion操作:insert_unique()和insert_equal()。前者表示节点的key一定在整个tree中独一无二,否则安插失败;后者表示节点的key可重复。
容器set和multiset,底层容器使用的是红黑树(rb_tree)
set/multiset以rb_tree为底层结构,因此有元素自动排序特性。排序的依据是key,而set/multiset元素的value和key合一:value就是key。
set/multiset提供遍历操作及iterators。按正常规则(++ite)遍历,便能获得排序状态(sorted)。
我们无法使用set\multiset的iterators改变元素值(因为key有其严谨的排列规则)。set\multiset的iterator是其底部的rb_tree的const iterator,就是为了禁止用户对元素赋值。
set元素的key必须独一无二,因此其insert()用的是rb_tree的insert_unique()。
multiset元素的key可以重复,因此其insert()用的是rb_tree的insert_qeual()。
延伸阅读:
二、红黑树概念
与AVL树一样,红黑树也是map、set等关联式容器的底层结构。但红黑树是现代主流的底层结构,STL使用的便是红黑树。其原因在于:AVL树保持平衡的方法太过于绝对(必须保证每个节点的左右子树的高度差不超过1),而红黑树的性质保证了其具有一定的”柔韧性”以及可观的效率。
红黑树的本质也是一颗二叉搜索树,但在原有的基础上做了平衡处理。红黑树的每个节点都会增加一个存储位,用来表示节点的颜色,可以是红色也可以是黑色。

相关推荐HOT
更多>>
什么是单片机,它的基本机构是什么?
一、单片机所谓单片机,就是把中央处理器CPU(Central Processing Unit)、存储器(Memory)、定时器、I/0(Input/Output)接口电路等一些核算...详情>>
2023-10-14 22:14:17
softmax有哪些作用?
一、多类别分类softmax函数经常用于深度学习模型的输出层,用于处理多类别分类问题。它可以将模型的原始输出转化为概率分布,使得每个类别的概...详情>>
2023-10-14 18:20:06
安卓代码中Gravity.LEFTGravity.TOP是什么原理?
一、安卓代码中Gravity.LEFTGravity.TOPgravity是设置自身内部元素的对齐方式。比如一个TextView,则是设置内部文字的对齐方式。如果是ViewGrou...详情>>
2023-10-14 13:52:05
怎么定okr?
一、明确目标目标是指要达成的结果,是OKR的“O”部分。明确目标的关键是要了解自己和组织的优势和劣势,以及市场和竞争环境,一般可以通过市场...详情>>
2023-10-14 12:07:04