c 中hash map的使用

2021-09-10 11:57:52 字數 1565 閱讀 3872

本人是極簡主義者,直奔主題。

概念:hash_map是用來儲存key-value鍵值對的集合,每乙個鍵值對是乙個entry,這些entry分散儲存在乙個陣列中  ;

核心技術:直接存址和解決衝突

儲存結構:分散的桶結構,每個桶節點中同時可以存放乙個單鏈表(該鍊錶使用頭插法生成,主要是為了解決雜湊衝突      的問題)

hash_map的key盡量使用簡單類,盡量不要使用自定義物件作為hsh_map的key,因為構造和拷貝構造會花費很大的時間,如若必需要,則使用物件的位址或指標,但是此時需要重寫比較仿函式(下文會介紹)。

hash_map的初始長度為16,後期動態增長的長度也應該是2^n;

hash_map在高併發情況下可能會出現死鎖;

hash_map並不是標準模板庫中的結構,c++ 11 版本及以後只是對其進行了支援,但是不同版本的編譯器實現方式上可能不同,所以如果**有跨平台需求的話,請盡量不要使用。

方式一:在類定義中重寫hash_value函式及比較小於號

class classa

int getvalue() const

void setvalue(int a)

public:

bool operator

friend size_t hash_value(const classa &thr)

private:

int c_a;

};方式二:在類外定義乙個對於結構hash_compare的自定義類的特化,並在其中衝在比較和計算hashcode的括號運算子;

template<>

struct hash_compare

// compare function

bool operator()(const classa& key1, const classa& key2) const

};以上兩種方式在實際使用hash_map時的定義方式為:std::hash_maphm;

//需要寫比較仿函式,因為傳遞的引數時char型別的指標,無法通過指標的大小判定兩個字串的大小

struct charless : public binary_function

}; //string類的基類是basic_string,basic_string中有對hash函式的重寫,但是沒有比較函式,所以要在此新增比較仿函式。

struct stringless : public binary_function

}; //cstring類中重寫hash_value和比較函式

inline size_t cstring_hash_value(const cstring& str)   

}   

return(value);   

}  class cstring_hash_compare : public hash_compare

bool operator()(const cstring& _keyval1, const cstring& _keyval2) const   

};以上實現hash_map時的定義方式為:std::hash_map cstringhash

hashMap使用中的效能提高

當你要建立乙個比較大的hashmap時,充分利用另乙個建構函式 public hashmap int initialcapacity,float loadfactor initialcapacity 初始容量 和loadfactor 載入因子。容量 是雜湊表中桶的數量,初始容量只是雜湊表在建立時的容...

C 中Hashtable和HashMap的區別

hashtable的應用非常廣泛,hashmap是新框架中用來代替hashtable的類,也就是說建議使用hashmap,不要使用hashtable。可能你覺得hashtable很好用,為什麼不用呢?這裡簡單分析他們的區別。1.hashtable的方法是同步的,hashmap未經同步,所以在多執行緒...

C 中map和hash map的區別

這裡列幾個常見問題,應該對你理解和使用hash map比較有幫助。建構函式。hash map需要hash函式,等於函式 map只需要比較函式 小於函式 儲存結構。hash map採用hash表儲存,map一般採用紅黑樹 rb tree 實現。因此其記憶體資料結構是不一樣的。總體來說,hash map...