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

STL:map与unordered_map

底层数据结构(本质区别)

map

底层是:红黑树(平衡二叉搜索树)

特点:

自动按 key 排序(默认升序)

插入后依然保持有序

map<int, int> m; m[3] = 30; m[1] = 10; m[2] = 20;

输出顺序:

1 2 3

unordered_map

底层是:哈希表

特点:

无序存储

元素位置由 hash 函数决定

unordered_map<int, int> m; m[3] = 30; m[1] = 10; m[2] = 20;

输出顺序(不确定):

2 3 1(可能是任何顺序)

时间复杂度

操作mapunordered_map
查找O(log n)O(1)(平均)
插入O(log n)O(1)(平均)
删除O(log n)O(1)(平均)

注意:

unordered_map最坏情况 O(n)(哈希冲突严重)

map始终稳定 O(log n)

是否有序

容器是否有序
map有序
unordered_map无序

多线程下的性能差异

unordered_map 插入查找快,但线程安全性差,需加锁或使用concurrent_unordered_map

map插入较慢,但访问结构清晰,适合在多线程并发读的场景下做共享(读锁+写锁)

总之在多线程环境下,map 的结构更适合读多写少的场景,配合shared_mutex可以实现并发读。而 unordered_map 虽然查找快,但并不适合直接并发写操作,除非我们通过分桶加锁,或者使用像 TBB 提供的 concurrent_unordered_map 这样的专业并发容器

unordered_map 发生哈希冲突会怎么处理?

当 unordered_map 发生哈希冲突时,会将多个哈希值相同的元素存入同一个哈希桶中,通常通过链表(链式地址法)或开放寻址法来解决;

C++ STL 中一般采用链表方式,即发生冲突的元素会插入到该桶对应链表的末尾,查找时需要遍历该链表,冲突多时会降低查找性能

为什么 unordered_map 最坏情况是 O(n)?

因为unordered_map 底层是哈希表结构,理论上查找和插入都是 O(1)但在最坏情况下,所有键的哈希值都一样(哈希冲突极端严重),所有元素都被插入到同一个桶中,退化成了链表结构,此时查找、插入、删除都变成了线性查找,时间复杂度退化为 O(n)。

map 和 unordered_map 的内存占用对比?

map 由于基于红黑树实现,每个节点需要存储指针(父节点、左右子节点)和颜色位,结构更紧凑且稳定;

而 unordered_map 基于哈希表实现,需要额外存储哈希桶数组(包含大量空位)、链表指针等结构,为了降低冲突还要预留扩容空间,因此在元素量相同时,unordered_map 的内存占用通常比 map 更高,但也换来了更快的查找效率(平均 O(1))。

哈希表的负载因子是啥?扩容机制如何?

哈希表的负载因子(Load Factor)是元素个数(N)与桶个数(B)之比,公式为:α = N / B,表示哈希表的“拥挤程度”;

当负载因子超过某个阈值(例如 0.75),就会触发扩容机制,即重新分配更大的桶数组对所有元素重新哈希(rehash),以减少冲突、保持插入和查找的效率;

扩容过程代价较大,会导致性能瞬时下降

http://www.jsqmd.com/news/648099/

相关文章:

  • 2.数据通信技术
  • el-date-picker ,自定义输入数字自动转换显示yyyy-mm-dd HH:mm:ss格式 【仅双日历 datetimerange专用】
  • Java-Study
  • Cursor Pro功能完整解锁指南:突破AI编程助手的限制
  • 别再乱用电容了!手把手教你给STM32电源设计选对电解电容和贴片电容
  • CANoe上位机自动化测试:程控电源与RS232串口通信的模块化设计
  • 21_命令模式
  • gRPC 核心概念、架构与生命周期
  • 超元力LED飞行影院:沉浸式科技与视听体验的双重探索
  • 跨平台多模态对齐难?SITS2026案例实证:3类异构数据融合方案,准确率提升42.7%!
  • 实验十七:验证路由器既隔离碰撞域也隔离广播域
  • 在 ADT 里把当前焦点对象直接做成可点击清单,基于 HTML 结果的 Focused Objects Display IDE Action 实战
  • 020、高性能Python:GIL、多进程与C扩展
  • 六分钟穿越天地:超元力LED飞行影院的沉浸式魅力
  • 算法基础应用精讲【人工智能】-基于稀疏Transformer的大规模文本生成系统
  • 毕业论文排版救星!Paperxie 一键搞定 4000 + 高校格式,本科生再也不用熬夜改格式了
  • 2026年评价高的一次性可降解餐具/一次性玉米淀粉餐具长期合作厂家推荐 - 品牌宣传支持者
  • 22_备忘录模式
  • mysql如何配置事务隔离级别_mysql isolation level修改方法
  • 《XQuery 参考手册》
  • 前端八股Vue---生命周期函数
  • 别再只会调PWM占空比了!手把手教你用Linux thermal子系统自动控制风扇转速
  • sdut-软件测试-黑盒测试2
  • 一套在线监测系统,轻松管好16个变压器室
  • 微信小程序里用H5预览PDF,我为什么放弃了原生组件选了pdf.min.js?
  • S32K144外部中断实战:用按键控制LED,手把手教你避开中断标志位清除的坑
  • 汽车c语言是什么?
  • 精通 Agent Skill:构建高效 AI 技能的完整指南
  • Zotero Better Notes:如何用3个步骤构建你的学术知识网络?
  • 2026年安卓APP安全加固公司哪家好?从技术、性能到合规的深度选型指南