map, unordered_map, multimap 和 set、unordered_set、multiset 的区别

1. mapmapmapunordered_mapunordered\_mapunordered_map

  • mapmapmap

    • 有序mapmapmap 按照元素的 key 排序,默认情况下使用 operatoroperator< 进行排序,也可以自定义排序规则。
    • 唯一性:每个 keykeykeymapmapmap 中是唯一的,一个 keykeykey 对应一个值 valuevaluevalue
    • 实现:通常基于红黑树(平衡二叉搜索树)实现。
    • 查找时间复杂度O(log N)O(log\ N)O(log N)
    • 典型用法:当你需要按顺序存储键值对时,使用 mapmapmap
  • unordered_mapunordered\_mapunordered_map

    • 无序unordered_mapunordered\_mapunordered_map 不按顺序存储元素,而是根据哈希值存储。
    • 唯一性:每个 keykeykeyunordered_mapunordered\_mapunordered_map 中是唯一的,一个 keykeykey 对应一个值 valuevaluevalue
    • 实现:基于哈希表实现。
    • 查找时间复杂度:通常为 O(1)O(1)O(1)(在哈希冲突较少的情况下),最坏情况为 O(N)O(N)O(N)
    • 典型用法:当你不关心元素顺序,只关心快速查找时,使用 unordered_mapunordered\_mapunordered_map

2. multimapmultimapmultimapmultisetmultisetmultiset

  • multimapmultimapmultimap

    • 有序multimapmultimapmultimap 按照元素的 key 排序,默认情况下使用 operatoroperator< 进行排序,也可以自定义排序规则。
    • 允许重复的 keymultimapmultimapmultimap 允许具有相同 keykeykey 的多个元素,但每个元素的 valuevaluevalue 可以不同。
    • 实现:通常基于红黑树实现。
    • 查找时间复杂度O(log N)O(log\ N)O(log N)
    • 典型用法:当你需要一个可以存储重复键值对的容器时,使用 multimapmultimapmultimap
  • multisetmultisetmultiset

    • 有序multisetmultisetmultiset 按照元素的值排序,默认情况下使用 operatoroperator< 进行排序,也可以自定义排序规则。
    • 允许重复元素multisetmultisetmultiset 允许元素重复,多个相同的元素会被存储。
    • 实现:通常基于红黑树实现。
    • 查找时间复杂度O(log N)O(log\ N)O(log N)
    • 典型用法:当你需要一个允许重复元素且需要排序的容器时,使用 multisetmultisetmultiset

3. setsetsetunordered_setunordered\_setunordered_set

  • setsetset

    • 有序setsetset 按照元素的值排序,默认情况下使用 operatoroperator< 进行排序,也可以自定义排序规则。
    • 唯一性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)

选择依据

  • 使用 mapmapmapsetsetset:如果你需要对元素进行排序并且确保唯一性。
  • 使用 unordered_mapunordered\_mapunordered_mapunordered_setunordered\_setunordered_set:如果你不关心顺序,只关心查找速度,且元素是唯一的。
  • 使用 multimapmultimapmultimapmultisetmultisetmultiset:如果你需要存储重复的元素,并且还希望元素保持有序。

你可能感兴趣的:(map, unordered_map, multimap 和 set、unordered_set、multiset 的区别)