map, unordered_map, multimap 和 set、unordered_set、multiset 的区别
1. mapmapmap 和 unordered_mapunordered\_mapunordered_map
-
mapmapmap:
- 有序:mapmapmap 按照元素的 key 排序,默认情况下使用 operator<operator<operator< 进行排序,也可以自定义排序规则。
- 唯一性:每个 keykeykey 在 mapmapmap 中是唯一的,一个 keykeykey 对应一个值 valuevaluevalue。
- 实现:通常基于红黑树(平衡二叉搜索树)实现。
- 查找时间复杂度:O(log N)O(log\ N)O(log N)。
- 典型用法:当你需要按顺序存储键值对时,使用 mapmapmap。
-
unordered_mapunordered\_mapunordered_map:
- 无序:unordered_mapunordered\_mapunordered_map 不按顺序存储元素,而是根据哈希值存储。
- 唯一性:每个 keykeykey 在 unordered_mapunordered\_mapunordered_map 中是唯一的,一个 keykeykey 对应一个值 valuevaluevalue。
- 实现:基于哈希表实现。
- 查找时间复杂度:通常为 O(1)O(1)O(1)(在哈希冲突较少的情况下),最坏情况为 O(N)O(N)O(N)。
- 典型用法:当你不关心元素顺序,只关心快速查找时,使用 unordered_mapunordered\_mapunordered_map。
2. multimapmultimapmultimap 和 multisetmultisetmultiset
-
multimapmultimapmultimap:
- 有序:multimapmultimapmultimap 按照元素的 key 排序,默认情况下使用 operator<operator<operator< 进行排序,也可以自定义排序规则。
- 允许重复的 key:multimapmultimapmultimap 允许具有相同 keykeykey 的多个元素,但每个元素的 valuevaluevalue 可以不同。
- 实现:通常基于红黑树实现。
- 查找时间复杂度:O(log N)O(log\ N)O(log N)。
- 典型用法:当你需要一个可以存储重复键值对的容器时,使用 multimapmultimapmultimap。
-
multisetmultisetmultiset:
- 有序:multisetmultisetmultiset 按照元素的值排序,默认情况下使用 operator<operator<operator< 进行排序,也可以自定义排序规则。
- 允许重复元素:multisetmultisetmultiset 允许元素重复,多个相同的元素会被存储。
- 实现:通常基于红黑树实现。
- 查找时间复杂度:O(log N)O(log\ N)O(log N)。
- 典型用法:当你需要一个允许重复元素且需要排序的容器时,使用 multisetmultisetmultiset。
3. setsetset 和 unordered_setunordered\_setunordered_set
-
setsetset:
- 有序:setsetset 按照元素的值排序,默认情况下使用 operator<operator<operator< 进行排序,也可以自定义排序规则。
- 唯一性:setsetset 中的元素是唯一的,不允许重复。
- 实现:通常基于红黑树实现。
- 查找时间复杂度:O(log N)O(log\ N)O(log N)。
- 典型用法:当你需要存储唯一元素并且需要排序时,使用 setsetset。
-
unordered_setunordered\_setunordered_set:
- 无序:unordered_setunordered\_setunordered_set 不按顺序存储元素,而是根据哈希值存储。
- 唯一性:unordered_setunordered\_setunordered_set 中的元素是唯一的,不允许重复。
- 实现:基于哈希表实现。
- 查找时间复杂度:通常为 O(1)O(1)O(1)(在哈希冲突较少的情况下),最坏情况为 O(N)O(N)O(N)。
- 典型用法:当你不关心元素顺序,只关心快速查找和唯一性时,使用 unordered_setunordered\_setunordered_set。
总结对比表格
| 类型 | 排序 | 唯一性 | 允许重复元素 | 实现方式 | 查找复杂度 |
|---|---|---|---|---|---|
| mapmapmap | 有序 | 唯一 | 否 | 红黑树 | O(log N)O(log\ N)O(log N) |
| unordered_mapunordered\_mapunordered_map | 无序 | 唯一 | 否 | 哈希表 | O(1)O(1)O(1) |
| multimapmultimapmultimap | 有序 | 唯一 | 是 | 红黑树 | O(log N)O(log\ N)O(log N) |
| multisetmultisetmultiset | 有序 | 唯一 | 是 | 红黑树 | O(log N)O(log\ N)O(log N) |
| setsetset | 有序 | 唯一 | 否 | 红黑树 | O(log N)O(log\ N)O(log N) |
| unordered_setunordered\_setunordered_set | 无序 | 唯一 | 否 | 哈希表 | O(1)O(1)O(1) |
选择依据
- 使用 mapmapmap 或 setsetset:如果你需要对元素进行排序并且确保唯一性。
- 使用 unordered_mapunordered\_mapunordered_map 或 unordered_setunordered\_setunordered_set:如果你不关心顺序,只关心查找速度,且元素是唯一的。
- 使用 multimapmultimapmultimap 或 multisetmultisetmultiset:如果你需要存储重复的元素,并且还希望元素保持有序。

浙公网安备 33010602011771号