本文来源: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