需要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 hashstruct 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 functionstruct 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.引入雜湊桶的概念來...