hashmap

来源:互联网 发布:oracle 监控软件 编辑:程序博客网 时间:2024/06/10 11:09

#include <hash_map>

#include <string>

using namespace std;

int main(){

        hash_map<int, string> mymap;

        mymap[9527]="唐伯虎点秋香";

        mymap[1000000]="百万富翁的生活";

        mymap[10000]="白领的工资底线";

        ...

        if(mymap.find(10000) != mymap.end()){

                ...

        }

够简单,和map使用方法一样。这时你或许会问?hash函数和比较函数呢?不是要指定么?你说对了,但是在你没有指定hash函数和比较函数的时候,你会有一个缺省的函数,看看hash_map的声明,你会更加明白。下面是SGI STL的声明:

template <class _Key, class _Tp, class _HashFcn = hash<_Key>,

class _EqualKey = equal_to<_Key>,

class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) >

class hash_map

{

        ...

}

也就是说,在上例中,有以下等同关系

hash_map<int, string> mymap;

//等同于:

hash_map<int, string, hash<int>, equal_to<int> > mymap;

Alloc我们就不要取关注太多了(希望深入了解Allocator的朋友可以参看标准库 STL :Allocator能做什么)

2.2 hash_map 的hash函数

hash< int>到底是什么样子?看看源码:

struct hash<int> {

        size_t operator()(int __x) const { return __x; }

};

原来是个函数对象。在SGI STL中,提供了以下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 shortstruct hash<int>

struct hash<unsigned intstruct hash<longstruct hash<unsigned long>

也就是说,如果你的key使用的是以上类型中的一种,你都可以使用缺省的hash函数。当然你自己也可以定义自己的hash函数。对于自定义变量,你只能如此,例如对于string,就必须自定义hash函数。例如:

struct str_hash{

        size_t operator()(const string& str) const

        {

                unsigned long __h = 0;

                for (size_t i = 0 ; i < str.size() ; i ++)

                __h = 5*__h + str[i];

                return size_t(__h);

        }

};

//如果你希望利用系统定义的字符串hash函数,你可以这样写:

struct str_hash{

        size_t operator()(const string& str) const

        {

                return return __stl_hash_string(str.c_str());

        }

};

在声明自己的哈希函数时要注意以下几点:

  1. 使用struct,然后重载operator().
  2. 返回是size_t
  3. 参数是你要hash的key的类型。
  4. 函数是const类型的。

如果这些比较难记,最简单的方法就是照猫画虎,找一个函数改改就是了。

现在可以对开头的"岳不群"进行哈希化了 . 直接替换成下面的声明即可:

map<string, string> namemap;

//改为:

hash_map<string, string, str_hash> namemap;

其他用法都不用边。当然不要忘了吧str_hash的声明以及头文件改为hash_map。

0 0
原创粉丝点击