我学hash_map(1)

本文来源:http://blog.chinaunix.net/uid-26548237-id-3800125.html 

map是什么?

map是键值对(key-value),复杂度是O(n).但是查找次数仍然会成为瓶颈。

hash_map是什么?

基本原理:使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数,也叫散列函数),使得每个元素的关键字都与一个函数值(即数组下标,hash值)相对应,于是用这个数组单元来存储这个元素;也可以简单的理解为,按照关键字为每一个元素“分类”,然后将这个元素存储在相应“类”所对应的地方,称为桶。哈希问题最重要的是两个方面“直接定址”和“解决冲突”。其过程为:

1-key

2-hash值

3-桶号(一般为求模)

4-key/value存入桶

取值过程是:

1-key

2-hash值

3-得到桶号

4-桶内元素是否和key相等。不等说明没找到。

5-相等,取出value

hash_map的使用

需要定义自己的hash函数,有以下几点要求。

1、使用struct,重载operator()

2、返回size_t

3、参数是你要hash的key类型

4、函数是const类型的

然后将hash函数写成如下形式的:

hash_map<string, string, str_hash> namemap;

下面再说比较函数:

hash_map中需要提供equal_to<key>

有两种方法,第一种重载==操作符。

struct mystruct{
        int iID;
        int len;
        bool operator==(const mystruct & my) const{
                return (iID==my.iID) && (len==my.len) ;
        }
};

这样就可以直接用equal_to<mystruct>了。第二种是用一个“函数对象”。自定义一个比较函数体。

struct compare_str{
        bool operator()(const char* p1, const char*p2) const{
                return strcmp(p1,p2)==0;
        }
};

然后就可以用下面这个东西了

typedef hash_map<const char*, string, hash<const char*>, compare_str> StrIntMap;
StrIntMap namemap;
namemap["岳不群"]="华山派掌门人,人称君子剑";
namemap["张三丰"]="武当掌门人,太极拳创始人";
namemap["东方不败"]="第一高手,葵花宝典";

原文的例子好搞笑。我更加倾向于使用第一种方法。因为我感觉第二种好像很麻烦。

时间: 2024-10-10 10:00:25

我学hash_map(1)的相关文章

我学hash_map(2)

啊,转眼之间就来到了我学hash_map(2)了.我们也从hash_map转移到了unordered_map上来了,今天这个文章的目的就是要来分享一下使用这个hash_map,哦不,unordered_map的一个方法. 直接贴代码--(懒死算了) #include <iostream> #include <unordered_map> using namespace std; struct node { int a; bool operator==(const node &

unordered_map(hash_map)和map的比较

测试代码: #include <iostream> using namespace std; #include <string> #include <windows.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <map> const int maxval = 2000000 *

学完了js的知识,一起分享总结知识点

又一个知识点学完了,到了总结学习效果和知识总结的时间了.js这个编程语言相对于html和css的逻辑性要强一些,也比较不容易上手.概念性的知识点不难理解,就是实际的操作并不容易,需要通过学习和借鉴案列来理解和帮助并提高实践操作的能力,把理论知识更好的结合到实践当中去,这样才能更有利于去理解和提高自己,做到知识的真正转化,缺乏理论概念性的支撑,有时真的很难上手,尤其是对于刚学习新手而言.所以需要总结知识点,大家可以互相分享一下学习的方式方法,知识总结,通过这种方式方法,相信可以有效的帮助解决一些学

[从产品角度学EXCEL 03]-单元格的秘密

这是<从产品角度学EXCEL>系列——单元格的秘密. 前言请看: 0 为什么要关注EXCEL的本质 1 EXCEL是怎样运作的 2 EXCEL里的树形结构 或者你可以去微信公众号@尾巴说数 获得连载目录. 本文仅由尾巴本人发布于特定网站.不接受任何无授权转载,如需转载,请先联系我,非常感谢. 在讲了excel的树形结构之后,我们终于要进入正题,研究单元格的秘密了. 当我们打开excel的时候,首先映入眼帘的就是一大片格子,这就是单元格. 在excel里,单元格承担了几乎所有的存储信息的功能.你

老司机亲自整理的和弦知识让你事半功倍学乐理

各种和弦 类别 和弦名称 和弦标记 结构 公式(度) 常用和弦 大三和弦 小三和弦 属七和弦 C Cm G7(大调) 1, 3, 5 1, 降b,5 5,7,2,4 大三+小三 小三+大三 大三+小三+小三 较常用和弦 大小七和弦 大七和弦 小七和弦 增三和弦 C7 Cmaj7 Cm7 Caug(C+) 1, 3,5, 降7 1,3,5,  7 1,降3,5,7 1,  3,升5 大三+小三+小三 大三+小三+大三 小三+大三+小三 大三+大三 不常用和弦 增大七和弦 半减七和弦 减七和弦 小大

本来连学计算机的都不是,怎么却读了计算机研究生

前两天成都出了太阳,本以为寒潮就此过去.结果今天又冷风呼呼吹,缩在家看书.手机震了一下,是微信有新的提醒,打开一看是 「小道消息」推送了一篇<学计算机的同学们啊,想清楚再去读研究生>,读完感觉一下击中了些什么,然后泛起一片片好多年前还在学校时的陈年旧忆.本来不打算在年前写文了,但感觉一下好像有很多想说的,就此写一篇吧,因为我就是计算机研究生毕业啊. 说起和计算机的渊源可以回溯到二十年前,我还在读初二.所在学校是四川一所少数民族中学,硬件条件不太好.那年国际友人赞助赠送给了学校几台 Apple

对学代码的一些心得

大家好,我是一名大三的学生——小林.我在大学里学的是行政管理专业.因为我的这个专业是文科专业,所以我对代码的知识可谓是一窍不通.但是我又很喜欢代码,很想学习代码.于是我就参加了兄弟连培训机构,在这里,我接触到了代码. 在我刚接触到代码的时候,真的是头都大了.我什么都不懂,连最基本的代码语句,代码知识都不会.于是我学起来有点吃力.但是听到这里的老师说,代码这东西还是要多敲,在做作业的时候都思考,这样学起来就很轻松. 于是在以后的上课中,我都非常认真的听老师讲课,听老师用代码讲解每一个案例.当然,只

C++ STL hash_map的使用以及STL hash_map的大“坑”

计算机编程中经常会用到hash表,而在C++中,使用STL编程更是少不了的.本文将介绍STL中hash_map的使用.在hash_map中使用自定义类型作为key值的方法以及在使用char *类型作为key值时遇到的问题. 一.需要的头文件以及命名空间 在linux下使用STL hash_map除了需要引用其所在头文件<hash_map>之外还要引用其命名空间.像这样写  1 using namespace __gnu_cxx; 二.hash_map的定义 先来看看hash_map是怎么定义的

工欲学其语,必先装软件

hi 现在是22点了,不是我今天偷懒(当然也有这种成分在里面,请不要揭穿),是今天所学都要装软件,然后手滑,就想起给其他事情所需软件一并解决了,所以,现在的情况是..还在装东西.这也是学习路上必不可少的一步吧,总结一下. 1.Zend Studio -哪个版本不重要,重要的是你需不需要破解使用. -学PHP必用,谁让这是PHP的亲儿子呢,就像我的安卓手机就是NEXUS5 2.Windows 10 -有个大白菜启动盘,事半功倍 -备份可能还是有必要的,除非你的机子也被你放弃了已经 -过程没什么说的