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个元素的适当桶数,并执行rehashtemplate<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:重新实现哈希函数和等于函数
 
