1)为什么需要hash_map

/*
例如:
我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改:
岳不群-华山派掌门人,人称君子剑
张三丰-武当掌门人,太极拳创始人
东方不败-第一高手,葵花宝典
【注】如果你使用STL 的map容器,你可以非常方便的实现这个功能,而不用关心其细节。
*/
#include <map>
#include <string>
using namespace std;
...
map<string, string> namemap; //增加
namemap["岳不群"]="华山派掌门人,人称君子剑";
namemap["张三丰"]="武当掌门人,太极拳创始人";
namemap["东方不败"]="第一高手,葵花宝典";
...
//查找
if(namemap.find("岳不群") != namemap.end()){...
}

上述程序用map去保存数据时特别效率,但是存在下面的问题:
一旦我门需要在大的数据库中频繁进行搜索时,时间复杂度大导致效率低下,因此引出hash_map!
【先介绍下为什么引出hash_map】
hash_map基于hash table(哈希表)。 哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。

1、hash_map和map的区别在哪里?
(1)构造函数:hash_map需要hash函数,等于函数;map只需要比较函数(小于函数).
(2)存储结构(底层数据结构不同):hash_map采用hash表存储,map一般采用红黑树(RB Tree)实现。
(3)map的优点:可以自动按照Key值进行排序;hash_map优点在于它各项操作的平均时间复杂度接近常数,即O(1).
(4)map属于STL标准的一部分,而hash_map则不是。
2、什么时候需要用hash_map,什么时候需要用map?
(1)总体来说,hash_map 查找速度会比map快,而且查找速度基本和数据量大小,属于常数级别;而map的查找速度是log(n)级别。并不一定常数就比log(n)小,hash还有hash函数的耗时,明白了吧,如果你考虑效率,特别是在元素达到一定数量级时,考虑考虑hash_map。
(2)但若你对内存使用特别严格,希望程序尽可能少消耗内存,那么一定要小心,hash_map可能会让你陷入尴尬,特别是当你的hash_map对象特别多时,你就更无法控制了,而且hash_map的构造速度较慢。
【总结】现在知道如何选择了吗?权衡三个因素: 查找速度, 数据量, 内存使用。
3、 如何用hash_map替换程序中已有的map容器?
这个很容易,但需要你有良好的编程风格。建议你尽量使用typedef来定义你的类型:
typedef map

C++中的hash_map和map的区别相关推荐

  1. 数组中的forEach和map的区别

    大多数情况下,我们都要对数组进行遍历,然后经常用到的两个方法就是forEach和map方法. 先来说说它们的共同点 相同点 都是循环遍历数组中的每一项 forEach和map方法里每次执行匿名函数都支 ...

  2. Java中Link,set 和Map的区别,ArrayList,HashSet和HashMap的区别。

    首先 List Set Map 分别继承了ArrayList HashSet HashMap , list 允许重复,set不允许重复,map是键值对形式,key-value key不能重复. 期次A ...

  3. 浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  4. Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别

    Java中的Set,List,Map的区别,对JAVA的集合的理解是相对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操作数目不固定的一 ...

  5. Java基础知识Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是相对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  6. stl中unordered_map 和 map的区别 ?

    stl中unordered_map 和 map的区别 目录 一.hash_map与unordered_map 二.unordered_map与map 三.unordered_map与unordered ...

  7. js数组中forEach/some/every/map/filter/reduce的区别

    2019独角兽企业重金招聘Python工程师标准>>> // js数组中forEach/some/every/map/filter/reduce的区别// 1. foreach:就是 ...

  8. JS数组中 forEach() 和 map() 的区别

    JS数组中 forEach() 和 map() 的区别 Array中 Array.forEach()和 Array.map()方法之间的区别. forEach()和map()方法通常用于遍历Array ...

  9. Java 8 Stream Api 中的 peek、map、foreach区别

    #1. 前言 我在Java8 Stream中讲述了 Java 8 Stream API 的一些内容.今天再看一下peek.map.foreach区别. 2. peek peek 操作接收的是一个 Co ...

最新文章

  1. 安波副教授:分布式人工智能进展与趋势
  2. [转] Jenkins实战演练之Windows系统节点管理
  3. cf1051F. The Shortest Statement(最短路)
  4. vue用户行为收集_vue 实现移动端键盘搜索事件监听
  5. C++counting sort计数排序的实现算法(附完整源码)
  6. 投影参数_投影仪参数怎么看?没搞懂之前千万不要买
  7. 容器,Docker, Kubernetes和Kyma,以及Kyma对SAP的意义
  8. 重新定义代理的扩展性:WebAssembly在Envoy与Istio中的应用
  9. css less 不要作用到子对象_使用Less实现网站主题切换
  10. java获取10位随机数_Java基础:JAVA中BitSet使用详解
  11. 转:Jmeter 用户思考时间(User think time),定时器,和代理服务器(proxy server)...
  12. Objections vs. excuses
  13. 长沙理工计算机科学与技术考研,2021年长沙理工大学计算机科学与技术(081200)考研专业目录_硕士研究生考试范围 - 学途吧...
  14. HTC vive追踪定位原理与精度
  15. [JS6] 通过用户事件事件执行脚本
  16. WinCE 5.0下的鼠标键盘驱动分析
  17. Centos Siege测试使用
  18. 【自学Android开发(一)】
  19. 超低功耗摄像头 门锁 猫眼
  20. java char定义为空_java – 检查char是否为空

热门文章

  1. 第六章---机器学习与数据建模
  2. Java 线程池框架核心代码分析--转
  3. weblogic查看内存情况
  4. 2018智能反欺诈洞察报告:黑中介、黑产智能化趋势明显
  5. 埃森哲咨询公司为何拥有世界上最多的区块链职位空缺
  6. 通过零知识证明,成为重要的区块链革新者
  7. MySQL-DB参数、内存、I/O、安全等相关参数设置
  8. Spring-Spring整合MyBatis详解
  9. Java-查看JVM从哪个JAR包中加载指定类
  10. Spring-Spring MVC + Spring JDBC + Spring Transaction + Maven 构建web登录模块