全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

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

发布时间:2023-10-11 05:10:45
发布人:xqq

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

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

#it技术干货

相关文章

数组与集合有什么不同?

数组与集合有什么不同?

2023-10-11
为什么采用线性探测法散列算法?

为什么采用线性探测法散列算法?

2023-10-11
C的数据结构和C++的有区别吗?

C的数据结构和C++的有区别吗?

2023-10-11
tpm管理是什么意思?

tpm管理是什么意思?

2023-10-11

最新文章

常见网络安全面试题:Windows常用的命令有哪些?

常见网络安全面试题:Windows常用的命令有哪些?

2023-10-09
常见网络安全面试题:根据设备告警如何展开排查?

常见网络安全面试题:根据设备告警如何展开排查?

2023-10-09
常见网络安全面试题:mysql加固呢?(数据库加固)

常见网络安全面试题:mysql加固呢?(数据库加固)

2023-10-09
常见网络安全面试题:windows和linux加固?(操作系统加固)

常见网络安全面试题:windows和linux加固?(操作系统加固)

2023-10-09
在线咨询 免费试学 教程领取