赞
踩
我们知道map和unordered_map都是按照关键字和对应的值进行存储的,二者也是极其相似的,但其实二者差别人大,很多人总是把二者混为一谈,不知道什么时候用map,什么时候用unordered_map,下面给大家解释二者的区别以及联系,最后总结在什么情况下使用map什么情况下使用unordered_map.
1.头文件不同
使用map的头文件是#include
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新增加了很多无序容器的管理操作,我们把通过哈希函数计算出相同值的元素都放进一个存储位置,这个位置我们称之为桶,下面列出一些对桶管理的成员函数。
以及
通过上述二者的区别和联系,我们大概可以区分什么时候用哪一种,如果我们注重查找插入效率,我们应该选择unordered_map,而我们如果注重存储效率,我们应该选用map,或者我们注重存储的元素是要有序的,我们应该使用map,换句话说,如果关键字类型固有就是无序的,或者性能测试发现问题可以通过哈希技术解决,那么可以使用无序容器unordered_map.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。