C++中map和hash_map的區別
這裏列幾個常見問題,應該對你理解和使用hash_map比較有幫助。 4.1 hash_map和map的區別在哪裏?構造函數。hash_map需要hash函數,等於函數;map只需要比較函數(小於函數). 4.2 什麼時候需要用hash_map,什麼時候需要用map?總體來說,hash_map 查找速度會比map快,而且查找速度基本和數據量大小無關,屬於常數級別;而map的查找速度是log(n)級別。並不一定常數就比log(n) 小,hash還有hash函數的耗時,明白了吧,如果你考慮效率,特別是在元素達到一定數量級時,考慮考慮hash_map。但若你對內存使用特別嚴格,希望程序儘可能少消耗內存,那麼一定要小心,hash_map可能會讓你陷入尷尬,特別是當你的hash_map對象特別多時,你就更無法控制了,而且hash_map的構造速度較慢。 現在知道如何選擇了嗎?權衡三個因素: 查找速度, 數據量, 內存使用。 這裏還有個關於hash_map和map的小故事,看看:http://dev.csdn.net/Develop/article/14/14019.shtm 4.3 如何在hash_map中加入自己定義的類型?你只要做兩件事, 定義hash函數,定義等於比較函數。下面的代碼是一個例子:
4.4如何用hash_map替換程序中已有的map容器?這個很容易,但需要你有良好的編程風格。建議你儘量使用typedef來定義你的類型: 4.5爲什麼hash_map不是標準的?具體爲什麼不 是標準的,我也不清楚,有個解釋說在STL加入標準C++之時,hash_map系列當時還沒有完全實現,以後應該會成爲標準。如果誰知道更合理的解釋,也希望告訴我。但我想表達的是,正是因爲hash_map不是標準的,所以許多平臺上安裝了g++編譯器,不一定有hash_map的實現。我就遇到了這樣的例子。因此在使用這些非標準庫的時候,一定要事先測試。另外,如果考慮到平臺移植,還是少用爲佳。 4.6 有學習使用hash_map的建議嗎?hash中文是哈希,也成爲散列,聽見別人說散列容器不要埋怨自己孤陋寡聞。瞭解hash系列,你還可以看看這篇文章:effective STL 25: 熟悉非標準散列容器, 另外建議查看源代碼。如果還有問題,那麼你可以在STL論壇上提問,會有高手回答你的。 |