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