map / unordered_map / set / unordered_set
map
1. 底层:红黑树(平衡二叉搜索树)
二叉搜索树:左子树所有节点的值 < 根节点的值;右子树所有节点的值 > 根节点的值;左右子树也都是二叉搜索树。二叉搜索树的优势在于查找过程的时间复杂度为 O(log n)
二叉搜索树的退化:如果插入的数据是 有序的(比如 1,2,3,4,5…),树就会长成一条“链表”;这时候树的高度是 n,查找/插入/删除都会退化成 O(n)
红黑树:为了避免退化,红黑树给每个节点染色(红或黑),并遵循 5 条规则:
(1)节点非红即黑。
(2)根节点是黑色。
(3)叶子节点(空指针 NIL)是黑色。
(4)红色节点不能相邻(即红节点的父/子必须是黑)。
(5)从任一节点到其所有叶子的路径上,黑色节点数相同(黑高一致)。
其中:规则 4 避免出现连续红色链 → 防止树过高;规则 5 保证所有路径的黑色节点数一致 → 防止某条路径过长;这样,红黑树的高度 ≤ 2 log₂(n+1),因此操作复杂度 O(log n)。所以红黑树在最坏情况下仍能保证 查找/插入/删除都是 O(log n)
2. 特性:有序(按照 key 从小到大排列);Key 唯一,不允许重复
unordered_map
1. 底层:哈希表
2. 特性:无序(依赖哈希函数,存储顺序不固定);Key 唯一,不允许重复;查找/插入一般是 O(1),但最坏情况下可能 O(n)
set
1. 底层:红黑树
2. 特性:有序(从小到大);只存 key(没有 value),key 唯一;插入时自动去重
unordered_set
1. 底层:哈希表
2. 特性:无序;只存 key,key 唯一;查找/插入平均 O(1)