C STL中的雜湊表 hash map

2021-07-02 05:37:46 字數 2097 閱讀 7242

需要hash_map的原因:map底層實現是紅黑數,查詢的效率是o(log n)。。但是hash_map的底層實現是雜湊表,它的查詢效率是o(1)

當資料很大的時候,比如100w的時候,map找的話要比較20次左右,但是hash_map卻只需要比較一到兩次。。

所以hash_map就需要了。

在定義hash_map容器的時候,不僅需要指定鍵和值的型別,還需要指定hash函式和相等函式

(一)hash_map 的hash函式

hash< int>到底是什麼樣子?看看原始碼:

struct hash 

};

原來是個函式物件。在sgi stl中,提供了以下hash函式:

struct hash

struct hashchar*>

struct hash

struct hashchar>

struct hashchar>

struct hash

struct hashshort>

struct hash

struct hashint>

struct hash

struct hashlong>

也就是說,如果你的key使用的是以上型別中的一種,你都可以使用預設的hash函式。當然你自己也可以定義自己的hash函式。對於自定義變數,你只能如此,例如對於string,就必須自定義hash函式。例如:

struct str_hash

};//如果你希望利用系統定義的字串hash函式,你可以這樣寫:

struct str_hash

};

在宣告自己的雜湊函式時要注意以下幾點:

使用struct,然後過載operator().

返回是size_t

引數是你要hash的key的型別。

函式是const型別的。

(二)hash_map 的比較函式

在map中的比較函式,需要提供less函式。如果沒有提供,預設的也是less< key> 。在hash_map中,要比較桶內的資料和key是否相等,因此需要的是是否等於的函式:equal_to< key> 

如果你使用乙個自定義的資料型別,如struct mystruct, 或者const char* 的字串,如何使用比較函式?

使用比較函式,有兩種方法. 

第一種是:過載==操作符

,利用equal_to;看看下面的例子:

struct mystruct

};

這樣,就可以使用equal_to< mystruct>作為比較函式了。

另一種方法就是使用函式物件

。自定義乙個比較函式體:

struct compare_str

};

有了compare_str,就可以使用hash_map了。

typedef hash_mapchar*, string, hashchar*>, compare_str> strintmap;

strintmap namemap;

namemap["岳不群"]="華山派掌門人,人稱君子劍";

namemap["張三丰"]="武當掌門人,太極拳創始人";

namemap["東方不敗"]="第一高手,葵花寶典";

(三)如何在hash_map中加入自己定義的型別?

#include

#include

#include

using

namespace std;

//define the class

class classa

int getvalue()const

void setvalue(int a)

private:

int c_a;

};//1 define the hash function

struct hash_a

};

//2 define the equal function

struct equal_a

};int main()

c stl 雜湊表(未完成)

include stdafx.h include include include include using namespace std int hash const string str int hashtablesize return hasval hashtablesize int hash ...

雜湊表mysql MySQL中雜湊表

也稱為雜湊表 由直接定址表改進而來.先看直接定址表 當關鍵字的全域u比較小時,直接定址是一種簡單而有效的技術。加入某應用要用到乙個動態集合,其中每個元素都有乙個取自全域u 的關鍵字。同時假設沒有兩個元素具有相同的關鍵字 用乙個陣列 即直接定址表 t 0.m 1 表示動態集合,其中每個位置 或稱槽或桶...

雜湊表(雜湊表)的定義

chapter 雜湊表 雜湊表 1.雜湊表 雜湊表 的定義 2.雜湊表是怎麼進行查詢的?3.雜湊函式設計 直接定址法 4.雜湊函式設計 除留餘數法 5.雜湊衝突處理 開放定址法 6.雜湊衝突處理 鏈位址法 7.雜湊表的鏈位址法實現 8.linux核心中的hash與bucket 9.引入雜湊桶的概念來...