本人是極簡主義者,直奔主題。
概念: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...