当前位置: 首页 > java >正文

map和unordered_map

一、map和unordered_map的基本概念——它们是啥?

  • map:是一种“有序的关联容器”,存放一组“键值对”,内部元素按键排序(默认是升序),类似一本按字母排序的字典。

  • unordered_map:也是存放“键值对”,但它是“无序的”,通过哈希表实现,存储顺序不可预知。


二、底层原理——为什么它们的速度和排序不一样?

1. map的底层结构

  • 基于平衡二叉搜索树(如红黑树)
  • 结构类似一棵彩色的“红黑树”
  • 节点存放键值对,树的中序遍历可以得到有序结果
  • 查找、插入、删除时间复杂度:都在**O(log n)**范围

2. unordered_map的底层结构

  • 基于哈希表(散列表)
  • 存储元素通过哈希函数映射到桶(桶是数组位置)
  • 数组和链表(或者开地址法)结合实现
  • 查找、插入、删除时间复杂度:平均为O(1),最坏情况下可能变成O(n)(比如哈希碰撞严重)

三、性能对比——哪个快?什么情况下用哪个?

比较维度mapunordered_map
底层结构红黑树哈希表
有序性有序(按键排序)无序(无序存储)
查找/插入/删除O(log n)平均 O(1),最坏 O(n)
迭代速度稍慢(因为树的中序遍历)较快(直接哈希桶遍历)
空间复杂度较大(存树结构)一般较小(哈希表)
适用场景需要元素按键排序快速查找,不关心顺序

四、通俗比喻:你买书和整理书架

想象一下:

  • map:你把书按照书名 alphabetical order 排好,每次查找、插入都像沿着一棵“有序的树”来找,耗费大约“走路的路程”是 O(log n)。

  • unordered_map:你用一个快递箱(哈希函数)把书存起来。想拿某一本书,只需要特定“快递单号”,基本上快速到达(O(1)),但有时候“快递箱”的标签碰撞(哈希冲突)就会得慢一些(最坏 O(n))。


五、具体使用建议——什么时候用map,什么时候用unordered_map?

场景推荐容器理由
需要从小到大遍历所有元素map有序,遍历顺序有序(比如字典序)
追求最大速度查找unordered_map平均O(1),查找快
元素需要按顺序处理map支持排序,方便按顺序操作
不关心元素顺序,只要快unordered_map速度快,特别大量数据时效果明显

六、额外细节:一些特定的注意点和坑

  • 哈希冲突:unordered_map的性能依赖哈希质量,当哈希冲突多了,性能可能下降;
  • 键的类型:自定义类型作为键时,要定义合适的哈希函数,否则unordered_map不能使用;
  • 空间利用:hash表会消耗更多内存,红黑树占用空间较少但操作更慢;
  • 排序需求:如果你需要元素的排序,必须用map。

总结一句话

  • map:用“红黑树”实现,有序存储查找复杂度O(log n),适合需要排序、稳定排序结果的场景;
  • unordered_map:用“哈希表”实现,无序存储平均查找O(1),用于追求极限速度的场景。
http://www.xdnf.cn/news/6244.html

相关文章:

  • 七部门:设立“国家创业投资引导基金”,优先支持取得关键核心技术突破的科技型企业上市融资
  • libmemcached库api接口讲解零
  • 使用frp实现客户端开机自启(含静默运行脚本)
  • IEEE PRMVAI 2025 “人工智能的应用“分论坛
  • 在 Rocky Linux 上手动安装 zsh
  • 龙虎榜——20250514
  • Postman接口测试
  • 操作系统实验 实验4 页面置换算法
  • python库sqlalchemy
  • 现代计算机图形学Games101入门笔记(八)
  • K8S redis 部署
  • 火线、零线、地线
  • 【HALCON】 HALCON 教程:正确使用 `get_dict_tuple` 获取字典内容
  • win11 VSCode 强制弹窗微软登录
  • 【数据管理平台测试文档】
  • 40-canvas中文字的横向对齐方式
  • CSS 锚点滑动效果的技术
  • NDM:高效全能的下载工具
  • 【设计模式】- 创建者模式
  • 2011-2020年各省粗离婚率数据
  • 记录: Windows下远程Liunx 系统xrdp 用到的一些小问题(免费踩坑 记录)
  • Qwen3模型架构、训练方法梳理
  • 因果推断 | 用SHAP分值等价因果效应值进行反事实推理
  • 怎样将MM模块常用报表设置为ALV默认格式(MB52、MB5B、ME2M、ME1M等)
  • Redis实现-优惠卷秒杀(基础版本)
  • 数据安全学习指南(1.0版本)
  • 开发指南112-样式的优先级别
  • Ascend的aclgraph(七)AclConcreteGraph:capture_begin
  • prisma连接关系型数据库如mysql数据库并完善用户的增删改查
  • ROOM 数据库 | 实现自定义 ContentProvider 插入数据