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做时间等索引