先说结论:unordered_map不维护键的顺序,因此不能按顺序访问元素,因此如果你需要遍历表时若选用unordered_map就肯定比map慢

1. 数据结构与底层实现

  • unordered_map:基于 哈希表 实现。

    • 优点:平均情况下插入、查找和删除操作的时间复杂度为 O(1)O(1)O(1)。
    • 缺点:最坏情况下,时间复杂度可能退化为 O(n)O(n)O(n)(当哈希冲突严重时)。
    • 无序存储,不能按键排序。
  • map:基于 红黑树(自平衡二叉搜索树) 实现。

    • 优点:插入、查找和删除操作的时间复杂度始终为 O(log⁡n)O(\log n)O(logn)。
    • 缺点:由于需要维护树的平衡,常数因子较大。
    • 按键排序,支持有序遍历。

2. 插入和查找性能

  • unordered_map 优势:在大多数情况下,unordered_map 插入和查找的性能优于 map,因为其平均时间复杂度为 O(1)O(1)O(1)。
  • map 劣势map 的插入和查找性能稍慢,时间复杂度为 O(log⁡n)O(\log n)O(logn)。

例外情况

  1. 哈希冲突严重:如果 unordered_map 的哈希函数设计不佳或数据分布极端(如大量相同的哈希值),性能可能退化为 O(n)O(n)O(n)。
  2. 小规模数据:对于数据规模较小的情况,map 的性能可能优于 unordered_map,因为红黑树的实现有较少的额外开销。

3. 内存使用

  • unordered_map 缺点:由于哈希表需要额外的存储空间(如空槽和链表节点),unordered_map 通常比 map 占用更多内存。
  • map 优势map 是基于树的实现,占用内存相对较少。

4. 顺序访问

  • unordered_map 缺点unordered_map 不维护键的顺序,因此不能按顺序访问元素。
  • map 优势map 自动按键的升序(或指定的比较函数)维护元素顺序,支持有序遍历。

5. 插入、删除时对迭代器的影响

  • unordered_map:当发生哈希表的重哈希(rehash)操作时,会使所有迭代器失效。
  • map:插入和删除元素只会影响相关位置的迭代器,其余迭代器不会失效。

6. 适用场景

场景 推荐使用容器 原因
快速查找/插入操作 unordered_map 平均时间复杂度 O(1)O(1)O(1)。
数据需要按键排序 map 支持有序遍历。
数据规模较小 map 红黑树常数因子较小。
内存有限 map unordered_map 占用内存较大。
哈希函数性能不佳或数据分布差 map unordered_map 性能退化明显。

总结

  • 如果需要快速插入、删除和查找操作且不关心顺序,优先选择 unordered_map
  • 如果需要按键排序或者可能遇到哈希冲突问题,选择 map
  • 如果内存占用敏感,选择 map

unordered_map比map慢?的更多相关文章

  1. C++11 新特性: unordered_map 与 map 的对比

    unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value.不同的是unordered_map不会根据key的大小进行排序, 存储时是根据key的ha ...

  2. hash_map vs unordered_map vs map vs unordered_set

    hash_map vs unordered_map 这两个的内部结构都是采用哈希表来实现.unordered_map在C++11的时候被引入标准库了,而hash_map没有,所以建议还是使用unord ...

  3. (转)unordered_map与map的对比(C++11新特性)

    unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value.不同的是unordered_map不会根据key的大小进行排序, 存储时是根据key的ha ...

  4. unordered_map 与 map 的对比(转)

    unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value.不同的是unordered_map不会根据key的大小进行排序, 存储时是根据key的ha ...

  5. map 与 unordered_map

    两者效率对比: #include <iostream> #include <string> #include <map> #include <unordere ...

  6. map,hash_map和unordered_map 实现比较

    map介绍 Map是STL[1]的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处 ...

  7. map和unordered_map的差别和使用

    map和unordered_map的差别还不知道或者搞不清unordered_map和map是什么的,请见:http://blog.csdn.net/billcyj/article/details/7 ...

  8. 【转】Map 与 Unordered_map

    map和unordered_map的差别和使用 map和unordered_map的差别还不知道或者搞不清unordered_map和map是什么的,请见:http://blog.csdn.net/b ...

  9. STL——map/unordered_map基础用法

    map /multimap map是STL里重要容器之一. 它的特性总结来讲就是:所有元素都会根据元素的键值key自动排序(也可根据自定义的仿函数进行自定义排序),其中的每个元素都是<key,  ...

  10. C++ map与unordered_map

    map与unordered_map对比 map unordered_map 红黑树(非严格二叉平衡搜索树)实现 哈希表实现 有序 无序 -- 查找时间复杂度为O(1),非常快 空间消耗较大 空间消耗较 ...

随机推荐

  1. Nuxt.js 应用中的 components:extend 事件钩子详解

    title: Nuxt.js 应用中的 components:extend 事件钩子详解 date: 2024/11/1 updated: 2024/11/1 author: cmdragon exc ...

  2. MyBatis-Plus条件构造器:构建安全、高效的数据库查询

    一.关于条件构造器(Wrapper) 1.1 简介 MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件.Wrapper 类允许开发者以链式调用的方式构 ...

  3. Windows系统密钥(实测可用)

    Windows Server 2003 R2 sp2 standard edition 文件名:cn_win_srv_2003_r2_standard_with_sp2_cd1_X13-13927.i ...

  4. 无法访问k8s.gcr.io下载镜像问题解决办法

    部署K8S最大的难题是镜像下载,在国内无FQ环境情况下很难从k8s.gcr.io等镜像源里下载镜像. 这种情况下正确做法是: 直接指定国内镜像代理仓库(如阿里云代理仓库)进行镜像拉取下载. 成功拉取代 ...

  5. manim边学边做--立方体和棱柱体

    本篇介绍Manim中创建三维立体的两个常用对象:Cube和Prism. Cube在制作动画时,可以用于展示立体几何中的立方体概念,或者通过旋转.缩放等动画效果来帮助理解三维空间中的几何变换. Pris ...

  6. .NET周刊【11月第2期 2024-11-10】

    国内文章 .NET 全能高效的 CMS 内容管理系统 https://www.cnblogs.com/1312mn/p/18511224 SSCMS 是一个完全开源的企业级内容管理系统,基于 .NET ...

  7. youtube视频下载,youtube-dl

    []为选填,用的时候去掉[] 用pip装youtube-dl pip install -U youtube-dl [--proxy=127.0.0.1:7890] youtube-dl下载youtub ...

  8. JESD79-5C_v1.30-2024 JEDEC DDR5 SOLID STATE TECHNOLOGY ASSOCIATION 最新内存技术规范

    JESD79-5C_v1.30-2024 JEDEC DDR5 SOLID STATE TECHNOLOGY ASSOCIATION 最新DDR5内存技术规范 ​ JEDEC 技术协会公布新 DDR5 ...

  9. 看不懂来打我,Vue3的watch是如何实现监听的?

    前言 watch这个API大家都很熟悉,今天这篇文章欧阳来带你搞清楚Vue3的watch是如何实现对响应式数据进行监听的.注:本文使用的Vue版本为3.5.13. 关注公众号:[前端欧阳],给自己一个 ...

  10. golang之热加载Fresh&air

    Fresh 是一个命令行工具,每次保存Go或模版文件时,该工具都会生成或重新启动Web应用程序.Fresh将监视文件事件,并且每次创建/修改/删除文件时,Fresh都会生成并重新启动应用程序.如果go ...