C++中的哈希容器unordered_map

    隨着C++0x標準的確立,C++的標準庫中也終於有了hash table這個東西。數據結構

    好久以來,STL中都只提供<map>做爲存放對應關係的容器,內部一般用紅黑樹實現,聽說緣由是二叉平衡樹(如紅黑樹)的各類操做,插入、刪除、查找等,都是穩定的時間複雜度,即O(log n);可是對於hash表來講,因爲沒法避免re-hash所帶來的性能問題,即便大多數狀況下hash表的性能很是好,可是re-hash所帶來的不穩定性在當時是不能容忍的。函數

    不過因爲hash表的性能優點,它的使用面仍是很廣的,因而第三方的類庫基本都提供了支持,好比MSVC中的<hash_map>和Boost中的<boost/unordered_map.hpp>。後來Boost的unordered_map被吸納進了TR1 (C++ Technical Report 1),而後在C++0x中被最終定了標準。性能

 

4.1 hash_map和map的區別在哪裏?對象

構造函數。hash_map須要hash函數,等於函數;map只須要比較函數(小於函數). 
存儲結構。hash_map採用hash表存儲,map通常採用紅黑樹(RB Tree)實現。所以其memory數據結構是不同的。 
4.2 何時須要用hash_map,何時須要用map?內存

總 體來講,hash_map 查找速度會比map快,並且查找速度基本和數據量大小無關,屬於常數級別;而map的查找速度是log(n)級別。並不必定常數就比log(n) 小,hash還有hash函數的耗時,明白了吧,若是你考慮效率,特別是在元素達到必定數量級時,考慮考慮hash_map。但若你對內存使用特別嚴格,但願程序儘量少消耗內存,那麼必定要當心,hash_map可能會讓你陷入尷尬,特別是當你的hash_map對象特別多時,你就更沒法控制了,並且 hash_map的構造速度較慢。hash

相關文章
相關標籤/搜索