C++八股 —— map/unordered_map
1. 底层数据结构
map —— 红黑树
随处可见的红黑树:原理、实现及应用场景 - 知乎
unordered_map —— 散列表
[C++] 哈希表(散列表)详解_c++哈希表-CSDN博客
2. 常见面试题
-
底层为红黑树的容器有哪些
map
multimap
set
multiset
-
红黑树和AVL树的区别
- 平衡规则不同:
- AVL树左右子树的高度差最大为1
- 红黑树的左右子树黑节点的高度相同
- 红黑树的平衡代价更小,插入和删除的效率更高
- AVL树提供更严格的平衡,查找性能更优
- 红黑树使用内存更多
- 平衡规则不同:
-
unordered_map
是否有缩容操作没有;负载因子超过阈值之后会有扩容操作,但是不会有自动缩容;
提供了接口,可以自己实现:
bucket_count; // 哈希桶个数 load_factor; // 获取当前负载因子 rehash(n); // 将哈希桶的个数设置为n,并执行rehash操作 reserve(n); // 分配容纳n个元素的适当桶数,并执行rehash
template<typename Key, typename Value> class CustomUnorderedMap { private:std::unordered_map<Key, Value> map;// 检查是否需要缩容void checkShrink() {if(map.size() > 1 && map.load_factor() < 0.1) {map.reserve(n: map.size());}}public:void erase(const Key& key) {map.erase(key);checkShrink();} };
-
unordered_map
有哪些性能优化- 预估元素数量并设置合适的哈希桶数量
- 合适的哈希函数,避免大量冲突
- 合适的负载因子(一般默认为0.7),
max_load_factor
-
map
和unordered_map
的区别- 底层数据结构不同:红黑树 - 散列表
- 查找性能: O ( l o g n ) O(logn) O(logn) - O ( 1 ) O(1) O(1)
- 是否有序:有序 - 无序
- 内存使用:少 - 多
- 使用场景:有序 - 无序
-
key为字符串,且不区分大小 或 结构体 或类对象,怎么处理
map
:重新实现比较函数unordered_map
:重新实现哈希函数和等于函数