C 中的hash map和map的區別

2021-07-28 03:28:31 字數 1610 閱讀 5813

1)為什麼需要hash_map

/*

例如:我要記錄乙個人名和相應的儲存,而且隨時增加,要快速查詢和修改:

岳不群-華山派掌門人,人稱君子劍

張三丰-武當掌門人,太極拳創始人

東方不敗-第一高手,葵花寶典

【注】如果你使用stl 的map容器,你可以非常方便的實現這個功能,而不用關心其細節。

*/#include

#include

using namespace std;

...

mapnamemap;

//增加

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 中map和hash map的區別

這裡列幾個常見問題,應該對你理解和使用hash map比較有幫助。建構函式。hash map需要hash函式,等於函式 map只需要比較函式 小於函式 儲存結構。hash map採用hash表儲存,map一般採用紅黑樹 rb tree 實現。因此其記憶體資料結構是不一樣的。總體來說,hash map...

hash map和map的區別

這裡列幾個常見問題,應該對你理解和使用hash map比較有幫助。4.1 hash map和map的區別在 4.2 什麼時候需要用hash map,什麼時候需要用map?總 體來說,hash map 查詢速度會比map快,而且查詢速度基本和資料量大小無關,屬於常數級別 而map的查詢速度是log n...

map和hash map的比較

hash map和map的區別在 建構函式。hash map需要hash函式,等於函式 map只需要比較函式 小於函式 儲存結構。hash map採用hash表儲存,map一般採用紅黑樹 rb tree 實現。因此其記憶體資料結構是不一樣的。什麼時候需要用hash map,什麼時候需要用map?ha...