C++中的hash_map和map的区别
1)為什么需要hash_map
/* 例如: 我要記錄一個人名和相應的存儲,而且隨時增加,要快速查找和修改: 岳不群-華山派掌門人,人稱君子劍 張三豐-武當掌門人,太極拳創始人 東方不敗-第一高手,葵花寶典 【注】如果你使用STL 的map容器,你可以非常方便的實現這個功能,而不用關心其細節。 */ #include <map> #include <string> using namespace std; ... map<string, string> namemap; //增加 namemap["岳不群"]="華山派掌門人,人稱君子劍"; namemap["張三豐"]="武當掌門人,太極拳創始人"; namemap["東方不敗"]="第一高手,葵花寶典"; ... //查找 if(namemap.find("岳不群") != namemap.end()){... }上述程序用map去保存數據時特別效率,但是存在下面的問題:
一旦我門需要在大的數據庫中頻繁進行搜索時,時間復雜度大導致效率低下,因此引出hash_map!
【先介紹下為什么引出hash_map】
hash_map基于hash table(哈希表)。 哈希表最大的優點,就是把數據的存儲和查找消耗的時間大大降低,幾乎可以看成是常數時間;而代價僅僅是消耗比較多的內存。
1、hash_map和map的區別在哪里?
(1)構造函數:hash_map需要hash函數,等于函數;map只需要比較函數(小于函數).
(2)存儲結構(底層數據結構不同):hash_map采用hash表存儲,map一般采用紅黑樹(RB Tree)實現。
(3)map的優點:可以自動按照Key值進行排序;hash_map優點在于它各項操作的平均時間復雜度接近常數,即O(1).
(4)map屬于STL標準的一部分,而hash_map則不是。
2、什么時候需要用hash_map,什么時候需要用map?
(1)總體來說,hash_map 查找速度會比map快,而且查找速度基本和數據量大小,屬于常數級別;而map的查找速度是log(n)級別。并不一定常數就比log(n)小,hash還有hash函數的耗時,明白了吧,如果你考慮效率,特別是在元素達到一定數量級時,考慮考慮hash_map。
(2)但若你對內存使用特別嚴格,希望程序盡可能少消耗內存,那么一定要小心,hash_map可能會讓你陷入尷尬,特別是當你的hash_map對象特別多時,你就更無法控制了,而且hash_map的構造速度較慢。
【總結】現在知道如何選擇了嗎?權衡三個因素: 查找速度, 數據量, 內存使用。
3、 如何用hash_map替換程序中已有的map容器?
這個很容易,但需要你有良好的編程風格。建議你盡量使用typedef來定義你的類型:
typedef map
總結
以上是生活随笔為你收集整理的C++中的hash_map和map的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vector/list/map/set的
- 下一篇: 如何快速将下载好的大量源代码文件加入到V