map、unordered_map、set、hash_set的比较

一、map

内部实现机理

map 内部实现了一个 红黑树红黑树是非严格平衡二叉搜索树,而 AVL 是严格平衡二叉搜索树), 红黑树具有自动排序的功能,因此 map 内部的所有元素都是有序的,红黑树的每一个节点都代表着 map 的一个元素。因此,对于 map 进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行的操作。map 中的元素是按照二叉搜索树(又名二叉查找树、二叉排序树,特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值)存储的,使用中序遍历可将键值按照从小到大遍历出来。

优缺点以及适用处

  1. 优点:有序性,这是 map 结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作;红黑树,内部实现一个红黑树使得 map 的很多操作在 O(logN) 的时间复杂度下就可以实现,因此效率非常的高。

  2. 缺点:空间占用率高,因为 map 内部实现了红黑树,虽然提高了运行效率(低于 unorder_map),但是因为每一个节点都需要额外保存父节点、孩子节点和红 / 黑性质,使得每一个节点都占用大量的空间(但占用的内存比 unorder_map 低)

  3. 适用处:对于那些数据存储有顺序要求的问题,用 map 会更高效一些

map 是基于 RBT 的,因此元素是有序存储的(默认按 的升序排列)。

二、unordered_map

内部实现机理

unordered_map 内部实现了一个 哈希表(也叫散列表,通过把关键码值映射到 Hash 表中一个位置来访问记录,查找的时间复杂度可达到 O(1),其在海量数据处理中有着广泛应用)。因此, 其元素的排列顺序是无序的

优缺点以及适用处

  1. 优点: 因为内部实现了哈希表,因此其查找速度非常的快(运行效率快于 map)
  2. 缺点: 哈希表的建立比较耗费时间(unorder_map 占用的内存比 map 要高)
  3. 适用处:对于查找问题,unordered_map 会更加高效一些,因此遇到查找问题,常会考虑一下用 unordered_map

使用举例

unordered_map 是基于 hash 表的,因此元素是无序存储的( 不按键 升序排列)。

三、set

内部实现机理

set 实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等。**在 set 中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。**平衡二叉检索树使用中序遍历算法,检索效率高于 vector、deque 和 list 等容器,另外使用中序遍历可将键值按照从小到大遍历出来。

使用举例

set 是基于 RBT 的,因此元素是顺序存储的(默认按 键值 升序排列)。

四、unordered_set

内部实现机理

unordered_set 的内部实现了一个 哈希表,因此, 其元素的排列顺序是无序的

unordered_set 是基于 hash 表的,因此元素是无序存储的( 不按键值 升序排列)。

五、总结

数据结构mapunordered_mapsetunordered_set
实现机理红黑树hash 表红黑树hash 表
元素格式key+valuekey+valuekeykey
存储规律键升序无序键升序无序
元素重复键不可, 值可键不可, 值可不可重复不可重复
头文件#include<map>#include<unordered_map>#include<set>#include<unordered_set>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值