CPP知识积累

CPP知识积累

STL库

map和unordered_map的区别

数据结构

  • map基于红黑树。红黑树是一种平衡二叉树的变体结构,左右子树高度差可能会大于一,但其平衡的代价要比平衡二叉树低。红黑树拥有自动排序的功能,因此map也就有了按键自动排序的功能,因此在map中的元素排列都是有序的。在map中,每一个元素都对应着一个红黑树的结点,所以实现对map的增删改查,也就是相当于对红黑树的操作。对于这些操作的复杂度都为O(logn),复杂度即为红黑树的高度。
  • unordered_map基于哈希表。散列表使得unordered_map的插入和查询速度接近于O(1)(在没有冲突的情况下),但是其内部元素的排列顺序是无序的。

元素顺序

  • map按照key进行自动排序
  • unordered_map无序

插入和查询的时间复杂度

  • map基于红黑树,复杂度与树高相同,即O(logn)。
  • unordered_map基于散列表,复杂度依赖于散列函数产生的冲突多少,但大多数情况下其复杂度接近于O(1)。

效率及其稳定性不同

  • map的查找类似于平衡二叉树的查找,其性能十分稳定。空间效率接近100%。
  • unordered_map的散列空间会存在部分未被使用的位置,所以其内存效率不是100%的。

使用场景

  • map:
    • 元素需要有序;
    • 对于单次查询时间较为敏感,必须保持查询性能的稳定性,比如实时应用等等。
  • unordered_map:
    • 要求查找速率快,且对单次查询性能要求不敏感。

总结

  • 在需要元素有序性或者对单次查询性能要求较为敏感时,请使用map,其余情况下应使用unordered_map。
  • 因此在需要使用字典结构进行算法编程的大部分情况下,都需要使用unordered_map而不是map。

关键字

auto关键字


CPP知识积累
https://sdueryrg.github.io/2025/08/04/CPP知识积累/
作者
yrg
发布于
2025年8月4日
许可协议