1️⃣ std::map
-
底层结构:红黑树(有序平衡二叉搜索树)。
-
键值特点 :键 有序 (默认用
<比较)。 -
查找/插入/删除 :
O(log n)。 -
迭代顺序:按键升序遍历。
-
适合场景 :需要按顺序遍历、按区间查找、或经常做
lower_bound、upper_bound的情况。
2️⃣ std::unordered_map
-
底层结构:哈希表(hash table)。
-
键值特点 :键 无序(存储顺序不可预测)。
-
查找/插入/删除 :平均
O(1),最坏O(n)(当哈希冲突严重时)。 -
迭代顺序:不可保证顺序,且随着 rehash 改变。
-
适合场景:不关心顺序、只追求快速查找的情况。
3️⃣ std::multimap
-
底层结构 :红黑树(与
map相同)。 -
键值特点 :允许相同键 (
map的 key 必须唯一,multimap可以重复)。 -
查找/插入/删除 :
O(log n)。 -
迭代顺序 :按键升序遍历(同
map)。 -
适合场景:需要一个键对应多个值时。
🔎 主要区别总结表
| 容器 | 底层结构 | 是否有序 | 是否允许重复键 | 查找/插入/删除复杂度 | 迭代顺序 | 适用场景 |
|---|---|---|---|---|---|---|
| map | 红黑树 | 有序 | 否 | O(log n) | 按键升序 | 需要排序或区间查找 |
| unordered_map | 哈希表 | 无序 | 否 | 平均 O(1) | 不保证 | 高速查找 |
| multimap | 红黑树 | 有序 | 是 | O(log n) | 按键升序 | 一个键多值 |
应用例子
1、unordered_map做订单容器
2、multimap做时间等索引