unordered_set和unordered_map是基于哈希表(散列表)来实现的,本身内部数据通常处于无序状态
set | unordered_set | map | unordered_map | |
---|---|---|---|---|
实现 | 红黑树 | 哈希表(散列表) | 红黑树 | 哈希表(散列表) |
有序性 | 有序 | 无序 | 有序 | 无序 |
插入时间复杂度 | O(logN) | O(1) | O(logN) | O(1) |
删除时间复杂度 | O(logN) | O(1) | O(logN) | O(1) |
查找时间复杂度 | O(logN) | O(1) | O(logN) | O(1) |
注意:unordered_set、unordered_map的O(1)的查找效率是在数据没有冲突的情况下,若数据存在冲突时间复杂度最差达到O(N)
set、map:
优点:
缺点:
查找的时间复杂度相对于unordered_set、unordered_map来说高一点
空间占用率高,红黑树每个结点需要额外存储父节点和孩子结点
unordered_set、unordered_map
优点:
缺点:
注意:由于哈希表的插入存在哈希函数(散列函数),所以遍历哈希表时候的顺序不一定是向哈希表中插入时候的顺序
unordered_set、unordered_map适用于查找比较频繁且内部数据冲突比较小的情况下,而map适用于对于顺序有一定要求的情况下
set和unordered_set、map和unordered_map的使用上并无太大区别
需要注意的是由于是由哈希表实现的,C++中使用vector充当桶,且需要确保<>中第一个数据类型是可哈希的,一般都是基本类型
参考:
c++中map与unordered_map的区别
(2条消息) c++中map与unordered_map的区别_wolfrevoda的博客-CSDN博客_c++ map unordered_map
哎,红黑树和哈希表,面试问三次了!
哎,红黑树和哈希表,面试问三次了! - 知乎 (zhihu.com)
unordered_map的键的类型问题
unordered_map的键的类型问题 - 知乎 (zhihu.com)