map与unordered_map
这里提一下,unordered_map在C++11的时候被引入标准库,而hash_map没有,所以建议使用unordered_map。
内部实现机理不同
map:
map的底层是一个红黑树(红黑树是非严格的平衡二叉搜索树),红黑树具有自动排序的功能,因此map内部的所有元素是有序的,map中的每一个元素都对应着红黑树中的一个节点,因此,map元素的查找、删除、插入等操作都对应于对红黑树进行操作,其时间复杂度都与树的高度有关,为O(logn),最坏情况和平均情况都是。
unordered_map:
unordered_map底层是用hash表来实现的,是通过把关键码值映射到hash表中的一个位置,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛的应用。另外,顾名思义,unordered_map是无序的。
优缺点比较
运行效率方面:
unordered_map比map高,但map提供了稳定的效率和有序的序列
占用内存方面:
map占用内存较低,unordered_map使用hash表实现的,内存占用略高
所以:
如果需要无序的容器快速查找、删除等,并且不担心稍高的内存时使用unordered_map;需要有序的容器内存在意时用map。
set与unordered_set
set与unordered_set区别和map与unordered_map区别类似。
这里就对unordered_set与unordered_map做一个比较:
unordered_set就是在hash表中插入value值,而这个value值就是它自己的key值;
这个容器是一个集合,所以在这个集合中插入相同的值是没有效果的。
而unordered_map在hash表中插入的是key-value键值对。
⚠️以上四种容器在使用时都需要引入对应的头文件
map:
#include <map>
unordered_map:
#include<unordered_map>
set:
#include<set>
unordered_set:
#include<unordered_set>