当前位置:   article > 正文

c++——浅谈map和unordered_map_c++中unorderedmap叫什么

c++中unorderedmap叫什么

我们知道map和unordered_map都是按照关键字和对应的值进行存储的,二者也是极其相似的,但其实二者差别人大,很多人总是把二者混为一谈,不知道什么时候用map,什么时候用unordered_map,下面给大家解释二者的区别以及联系,最后总结在什么情况下使用map什么情况下使用unordered_map.

区别

1.头文件不同
使用map的头文件是#include
使用unordered_map的头文件是#include<unordered_map>

2.底层结构不同
这个区别也是二者最大的区别之一,也是经常有人把二者混为一谈的直接原因。
首先map底层的数据结构是红黑树,红黑树也是平衡二叉树的一种,既然map的底层是二叉树,那么对于map的各种操作,比如插入,删除,查找等等操作的时间复杂度都是o(logn),即为树的高度。
而unordered_map的底层结构为哈希表(散列表)实现的,所以unordered_map也被叫做hashmap,即元素存储的方式是关键字直接通过哈希函数(散列函数)计算后得到散列地址而存储的,因此查找和插入的时间复杂度为o(1)(在没用冲突的情况下),具体有冲突的情况就要看处理冲突的方法判断其时间复杂度,感兴趣的读者可以查询哈希表关于处理冲突的方法这方面的资料。

3.关键字排列的顺序不同
底层的数据结构决定了二者关键字的排列是否有序还是无序,map的底层是红黑树,那么map关键字是有序的,而unordered_map底层为哈希表,通过哈希函数计算存储的地址,因此数据的排列是无序的。

4.存储效率不同
和3同样,底层的数据结构就决定了其存储的效率,map的存储效率接近100%,而unordered_map由于哈希函数的缘故,会造成有很多地址没有存储数据,造成了空间的浪费,存储效率低,具体可以看不同的哈希函数的实现,来了解存储效率低的原因

联系
unordered_map都有和map类似的操作,比如find(),insert()等等,但是unordered_map新增加了很多无序容器的管理操作,我们把通过哈希函数计算出相同值的元素都放进一个存储位置,这个位置我们称之为桶,下面列出一些对桶管理的成员函数。

  1. bucket_count() 计算正在使用桶的数目
  2. max_bucket_count() 容器能够容纳最多桶的数量
  3. bucket_size(n) 编号为n的桶内有多少个元素
  4. bucket(k) 关键字为k的元素在哪个桶里面

以及
在这里插入图片描述

总结

通过上述二者的区别和联系,我们大概可以区分什么时候用哪一种,如果我们注重查找插入效率,我们应该选择unordered_map,而我们如果注重存储效率,我们应该选用map,或者我们注重存储的元素是要有序的,我们应该使用map,换句话说,如果关键字类型固有就是无序的,或者性能测试发现问题可以通过哈希技术解决,那么可以使用无序容器unordered_map.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/1019094
推荐阅读
相关标签
  

闽ICP备14008679号