千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > c++ multimap是红黑树还是什么?

c++ multimap是红黑树还是什么?

来源:千锋教育
发布人:xqq
时间: 2023-10-11 05:10:45 1696972245

一、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),而红黑树的性质保证了其具有一定的”柔韧性”以及可观的效率。

红黑树的本质也是一颗二叉搜索树,但在原有的基础上做了平衡处理。红黑树的每个节点都会增加一个存储位,用来表示节点的颜色,可以是红色也可以是黑色。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT