C++中的hash_map和map的区别
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的区别相关推荐
- 数组中的forEach和map的区别
大多数情况下,我们都要对数组进行遍历,然后经常用到的两个方法就是forEach和map方法. 先来说说它们的共同点 相同点 都是循环遍历数组中的每一项 forEach和map方法里每次执行匿名函数都支 ...
- Java中Link,set 和Map的区别,ArrayList,HashSet和HashMap的区别。
首先 List Set Map 分别继承了ArrayList HashSet HashMap , list 允许重复,set不允许重复,map是键值对形式,key-value key不能重复. 期次A ...
- 浅谈Java中的Set、List、Map的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别
Java中的Set,List,Map的区别,对JAVA的集合的理解是相对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操作数目不固定的一 ...
- Java基础知识Set、List、Map的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是相对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- stl中unordered_map 和 map的区别 ?
stl中unordered_map 和 map的区别 目录 一.hash_map与unordered_map 二.unordered_map与map 三.unordered_map与unordered ...
- js数组中forEach/some/every/map/filter/reduce的区别
2019独角兽企业重金招聘Python工程师标准>>> // js数组中forEach/some/every/map/filter/reduce的区别// 1. foreach:就是 ...
- JS数组中 forEach() 和 map() 的区别
JS数组中 forEach() 和 map() 的区别 Array中 Array.forEach()和 Array.map()方法之间的区别. forEach()和map()方法通常用于遍历Array ...
- Java 8 Stream Api 中的 peek、map、foreach区别
#1. 前言 我在Java8 Stream中讲述了 Java 8 Stream API 的一些内容.今天再看一下peek.map.foreach区别. 2. peek peek 操作接收的是一个 Co ...
最新文章
- 安波副教授:分布式人工智能进展与趋势
- [转]	Jenkins实战演练之Windows系统节点管理
- cf1051F. The Shortest Statement(最短路)
- vue用户行为收集_vue 实现移动端键盘搜索事件监听
- C++counting sort计数排序的实现算法(附完整源码)
- 投影参数_投影仪参数怎么看?没搞懂之前千万不要买
- 容器,Docker, Kubernetes和Kyma,以及Kyma对SAP的意义
- 重新定义代理的扩展性:WebAssembly在Envoy与Istio中的应用
- css less 不要作用到子对象_使用Less实现网站主题切换
- java获取10位随机数_Java基础:JAVA中BitSet使用详解
- 转:Jmeter 用户思考时间(User think time),定时器,和代理服务器(proxy server)...
- Objections vs. excuses
- 长沙理工计算机科学与技术考研,2021年长沙理工大学计算机科学与技术(081200)考研专业目录_硕士研究生考试范围 - 学途吧...
- HTC vive追踪定位原理与精度
- [JS6] 通过用户事件事件执行脚本
- WinCE 5.0下的鼠标键盘驱动分析
- Centos Siege测试使用
- 【自学Android开发(一)】
- 超低功耗摄像头 门锁 猫眼
- java char定义为空_java – 检查char是否为空