linux关于hash_map的使用(基于c++的,以string的key为例)

来源:互联网 发布:热血传奇刷元宝软件 编辑:程序博客网 时间:2024/06/06 18:06

1,包含相应头文件:

#include <ext/hash_map>

        using namespace __gnu_cxx;

2,针对key进行处理:基本类型的key可以采用缺省的hash函数,而自定义类型需要实现相应的hash值计算函数与定义比较函数

3,定义hash_map变量:

为减少冗余度,我们使用typedef来定义hash_map:

typedef hash_map< key, value, hasher, compare> myHmap;

这四个参数分别为:

key - 关键字、下标; value - 对应的值。hasher - hash函数,compare - key的比较函数

hash_map的成员函数基本与map一致。


一、关于hash函数:

对于基本类型的key,stl提供了以下hash函数,即如果key使用下面类型,就可以使用缺省的hash函数,当然,也可以自定义。

struct hash<char*>

struct hash<const char*>

struct hash<char>

struct hash<unsigned char>

struct hash<signed char>

struct hash<short>

struct hash<unsigned short>

struct hash<int>

struct hash<unsigned int>

struct hash<long>

struct hash<unsigned long> 

对于自定义类型,如string,就必须要自定义hash函数了,我们也可以利用系统定义的字符串hash函数:

 struct str_hash

{

    size_t operator() (const string& str) const

    {

     return __stl_hash_string(str.c_str());

    }

}


三、hash_map的比较函数(以string为例)

 struct compare_str

{

    bool operator()(const char* p1, const char* p2) const 

    {

    return strcmp(p1, p2)==0;

    }

}

四,hash_map插入与取值过程:

其插入过程是:

  1. 得到key
  2. 通过hash函数得到hash值
  3. 得到桶号(一般都为hash值对桶数求模)
  4. 存放key和value在桶内。

其取值过程是:

  1. 得到key
  2. 通过hash函数得到hash值
  3. 得到桶号(一般都为hash值对桶数求模)
  4. 比较桶的内部元素是否与key相等,若都不相等,则没有找到。
  5. 取出相等的记录的value。

五,个人理解:



即,

存储:key -> f(key) 得到addr,将key和value存储于桶内地址addr

查询:key -> f(key) 得到addr,判断该addr的数据是否与key相等,如果相等则从该addr中读取出value。


参考:

http://blog.csdn.net/luo6620378xu/article/details/8515666

http://blog.csdn.net/sdhongjun/article/details/4517325#

http://stlchina.huhoo.net/twiki/bin/view.pl/Main/STLDetailHashMap



0 0
原创粉丝点击