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

c++ map与unordered_map的比较

c++ map与unordered_map的比较

在c++的STL库中,有map与unordered_map这两种名字十分相似的容器,但是他们的区别还是很大,下面我们从 底层实现性能特性适用场景进行逐一比较

底层实现

std::mapstd::unordered_map
底层数据结构红黑树(平衡二叉搜索树)哈希表(数组 + 链表/红黑树解决冲突)
是否有序按键的升序排列(默认 std::less<K>无序存储(依赖哈希函数)
内存布局节点分散存储(指针连接)连续数组 + 冲突链

性能特性

操作std::mapstd::unordered_map
插入/删除𝑂(log⁡𝑛)O(logn)平均 𝑂(1)O(1),最差 𝑂(𝑛)O(n)
查找𝑂(log⁡𝑛)O(logn)平均 𝑂(1)O(1),最差 𝑂(𝑛)O(n)
遍历有序键𝑂(𝑛)O(n)(天然有序)需额外排序 𝑂(𝑛log⁡𝑛)O(nlogn)

注:unordered_map 的 O(1)性能依赖于良好的哈希函数和负载因子管理

适用场景

map的底层是一颗红黑树,因此map的最大特点就是有序,map的适用场景如下:

  1. 需要有序遍历或范围查询

    • 例如,按字典序输出键值对,或查找 [start, end] 区间内的数据

    • 典型应用:日志时间戳排序、排行榜数据存储

  2. 键类型不支持哈希或哈希质量差

    • 如果键类型(如自定义结构体)没有良好的哈希函数,std::map 更合适
  3. 内存敏感场景

    • 红黑树的内存占用通常比哈希表低,适合嵌入式或资源受限环境
  4. 需要稳定性能

    • 红黑树的最坏时间复杂度仍为 O*(log*n),适合对延迟敏感的应用

unordered_map的底层是通过hash函数实现的,因此unordered_map的最大特点是极速查找,map的适用场景如下:

  1. 高频查找、插入、删除操作
    • 例如,缓存系统(Redis-like)、词频统计、实时数据处理
    • 典型应用:网页访问计数器、数据库索引优化
  2. 键类型有高质量哈希函数
    • intstd::string 等标准类型,或自定义类型已特化 std::hash
  3. 不关心元素顺序
    • 例如,仅需检查某个键是否存在,或快速存取数据
  4. 大规模数据存储
    • 当数据量极大时,哈希表的平均 𝑂(1)O(1) 性能优势更明显

总结:根据实际需求权衡选择:有序性 vs 极速查找

http://www.xdnf.cn/news/326.html

相关文章:

  • 抖音“碰一碰发视频”源码搭建:碰一碰定制化开发
  • 西门子 博途 软件 崩溃
  • 接口自动化测试(二)
  • 不一样的flag 1(迷宫题)
  • 《软件设计师》复习笔记(11.2)——开发方法、产品线、软件复用、逆向
  • 从零实现Git安装、使用
  • Java 爬虫按关键字搜索淘宝商品:实现与优化
  • MARA/MARC表 PSTAT字段
  • [特殊字符] 当Docker遇上大模型:本地运行LLM的奇幻漂流 [特殊字符]
  • 高阶数据结构 图 (上)
  • UR5e机器人动力学
  • 大模型如何突破“知识盲区”?一场静悄悄的技术革命正在发生
  • [Vue3]动态引入图片
  • NHANES指标推荐:CMI
  • 阿里云服务器搭建开源版禅道
  • 高级工程师评审-隐藏的条件都有哪些
  • gitee提交大文件夹
  • MapWindow GIS:开源的GIS程序 库和工具,适用于基于C#和.NET的应用程序
  • 电路安全智控系统与主机安全防护系统主要功能是什么
  • Spring lazy-init 懒加载的原理
  • Vue自定义指令-防抖节流
  • 易派客九周年再启新程 数智赋能工业供应链高质量发展
  • 开发者调研:使用AI工具后需求交付效率提升210%
  • 安卓手机万能遥控器APP推荐
  • Qt 入门 5 之其他窗口部件
  • 2025年4月18日漏洞文字版表述一句话版本(漏洞危害以及修复建议),通常用于漏洞通报中简洁干练【持续更新中】,漏洞通报中对于各类漏洞及修复指南
  • Vue3+Openlayers教程导航页【目录】
  • DeepSeek 部署中的常见问题及解决方案
  • easyui进度条
  • ValueError: model.embed_tokens.weight doesn‘t have any device set