转自https://blog.csdn.net/liumou111/article/details/49252645

在之前使用STL时,经常混淆的几个数据结构,特别是做Leetcode的题目时,对于使用哪一个map,一直没有太明确的概念,事实上,三个容器,有着比较大的区别.

1. map

  内部数据的组织,基于红黑树实现,红黑树具有自动排序的功能,因此map内部所有的数据,在任何时候,都是有序的。

2. hash_map

  基于哈希表,数据插入和查找的时间复杂度很低,几乎是常数时间,而代价是消耗比较多的内存。底层实现上,使用一个下标范围比较大的数组来存储元素,形成很多的桶,利用hash函数对key进行映射到不同区域进行保存。

  • 插入操作:得到key -> 通过hash函数得到hash值 -> 得到桶号(hash值对桶数求模) -> 存放key和value在桶内
  • 取值过程:得到key -> 通过hash函数得到hash值 -> 得到桶号(hash值对桶数求模) -> 比较桶内元素与key是否相等 -> 取出相等纪录的value
  • 当每个桶内只有一个元素时,查找时只进行一次比较,当很多桶都没有值时,查询更快。
  • 用户可以指定自己的hash函数与比较函数。

3. unordered_map

  C++ 11标准中加入了unordered系列的容器。unordered_map记录元素的hash值,根据hash值判断元素是否相同。map相当于java中的TreeMap,unordered_map相当于HashMap。无论从查找、插入上来说,unordered_map的效率都优于hash_map,更优于map;而空间复杂度方面,hash_map最低,unordered_map次之,map最大。

  对于STL里的map容器,count方法与find方法,都可以用来判断一个key是否出现,count统计的是key出现的次数,因此只能为0/1,而find基于迭代器实现,以mp.end()判断是否找到要求的key。

下面测试说明了速度之间的比较:

map类型 插入速度 插入和查找速度
hashmap 0m0.123s 0m0.369s
map 0m0.190s 0m0.681s
unordered_map 0m0.123s 0m0.315s
  • 为什么要使用unordered_map代替hash_map?

    • 因为标准化的推进,unordered_map原来属于boost分支和std::tr1中,而hash_map属于非标准容器。
    • 另外,使用之后,感觉速度和hash_map差不多,但是支持string做key,也可以使用复杂的对象作为key。
    • gxx需要添加编译选项:--std=gnu++0x或者--std=c++0x

STL中的map、unordered_map、hash_map相关推荐

  1. 关于STL中的map和hash_map

    在网上看到有关STL中hash_map的文章,以及一些其他关于STL map和hash_map的资料,总结笔记如下:     1.STL的map底层是用红黑树实现的,查找时间复杂度是log(n):   ...

  2. c++的STL中的map(哈希表)与unordered_map

    map: unordered_map: map: map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的 unordered_map:unordered_map内部实 ...

  3. map unordered_map hash_map的查找性能测试

    结论如下: Release模式下: 1. 容量为10的时候,查找效率:map > unordered_map > hash_map 2. 容量为100的时候,查找效率:map = unor ...

  4. 红黑树实现——STL中的map

    From: http://blog.csdn.net/zhongjiekangping/article/details/6934571 红黑树实现--STL中的map [ 2009-07-24 13: ...

  5. C++ std map unordered_map hash_map 的查找性能测试代码及结果

    C++ std map unordered_map hash_map 的查找性能测试代码.过程及结果 测试环境 测试结果 测试代码 测试过程记录 测试版本 RLEASE x64 测试版本 Debug ...

  6. C++ STL中哈希表 hash_map介绍

    0 为什么需要hash_map 用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能.例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: 岳不群-华 ...

  7. 关于STL中的map用法

      STL中map用法详解         std map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力, ...

  8. STL中的map简单详解

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

  9. STL中的map集合扩展字段比较方便

    扩展字段map<string, string>真是个好东西, 在定各种协议时很常用,便于扩展 #include <iostream> #include <map> ...

最新文章

  1. 我花了三个小时写了一道题的六千字题解....(POJ 2888 Magic Bracelet)
  2. mc pe Linux服务器,MC 基岩版(PE) 服务器来了
  3. 做微波有源电路的设计仿真 一般都用什么软件 matlab可以吗,MATLAB在有源滤波器仿真设计中的应用...
  4. 线程同步----递归锁
  5. 在Android设备部署PyTorch模型
  6. mysql left join 索引失效_MySQL索引列上做操作导致索引失效案例分析
  7. [Todo] 乐观悲观锁,自旋互斥锁等等
  8. 果园机器人是什么文体_果园机器人课文原文
  9. android sdk 安装_Appium+python自动化1-环境安装(上)
  10. 用promise封装ajax_ES6-promise封装AJAX请求
  11. apache php mysql配置详解,详细介绍:Apache+PHP+MySQL配置攻略_php基础
  12. 解决python读取json格式数据后提取object不存在报错KeyError
  13. 记一次mysql千万订单汇总查询优化
  14. python数据库管理软件_数据库管理工具神器-DataGrip,可同时管理多个主流数据库[SQL Server,MySQL,Oracle等]连接 - Python社区...
  15. linux内核设计与实现 epub_mongodb内核源码设计实现、性能优化、最佳运维系列-网络传输层模块源码实现四...
  16. 星河互联刘玮玮:Echo卖疯了,为什么擅长制造爆款的中国人又没跟上?
  17. 高通CSR8615蓝牙音频模块单芯片介绍
  18. 软件测试车载系统,车载软件测试
  19. android apk安装包 华为提示安装包无效或与操作系统不兼容,魅族提示apk仅为测试版,要求下载正式版安装
  20. leetcode402. 移掉 K 位数字

热门文章

  1. 谷歌CEO:没有这项能力,再牛的程序员也不要!
  2. 前沿 | DeepMind改进超参数优化:遗传算法效果超越贝叶斯
  3. 重要更新 | 谷歌发布 TensorFlow 1.4,迁移Keras,支持分布式训练
  4. 谁再说不熟悉Linux命令,就把这个给他扔过去!
  5. 高并发下秒杀商品,你必须知道的9个细节
  6. 怎么去掉 IDEA 中 XML 显示的屎黄色
  7. Spring是如何运用设计模式的?
  8. 为什么推荐 Java 程序员使用 Google Guava 编程
  9. 周志华,李航来智源大会了!
  10. 风控特征—关系网络特征工程入门实践