日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++中的hash_map和map的区别

發(fā)布時(shí)間:2025/3/21 c/c++ 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中的hash_map和map的区别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1)為什么需要hash_map

/* 例如: 我要記錄一個(gè)人名和相應(yīng)的存儲(chǔ),而且隨時(shí)增加,要快速查找和修改: 岳不群-華山派掌門(mén)人,人稱(chēng)君子劍 張三豐-武當(dāng)掌門(mén)人,太極拳創(chuàng)始人 東方不敗-第一高手,葵花寶典 【注】如果你使用STL 的map容器,你可以非常方便的實(shí)現(xiàn)這個(gè)功能,而不用關(guān)心其細(xì)節(jié)。 */ #include <map> #include <string> using namespace std; ... map<string, string> namemap; //增加 namemap["岳不群"]="華山派掌門(mén)人,人稱(chēng)君子劍"; namemap["張三豐"]="武當(dāng)掌門(mén)人,太極拳創(chuàng)始人"; namemap["東方不敗"]="第一高手,葵花寶典"; ... //查找 if(namemap.find("岳不群") != namemap.end()){... }

上述程序用map去保存數(shù)據(jù)時(shí)特別效率,但是存在下面的問(wèn)題:
一旦我門(mén)需要在大的數(shù)據(jù)庫(kù)中頻繁進(jìn)行搜索時(shí),時(shí)間復(fù)雜度大導(dǎo)致效率低下,因此引出hash_map!
【先介紹下為什么引出hash_map】
hash_map基于hash table(哈希表)。 哈希表最大的優(yōu)點(diǎn),就是把數(shù)據(jù)的存儲(chǔ)和查找消耗的時(shí)間大大降低,幾乎可以看成是常數(shù)時(shí)間;而代價(jià)僅僅是消耗比較多的內(nèi)存。

1、hash_map和map的區(qū)別在哪里?
(1)構(gòu)造函數(shù):hash_map需要hash函數(shù),等于函數(shù);map只需要比較函數(shù)(小于函數(shù)).
(2)存儲(chǔ)結(jié)構(gòu)(底層數(shù)據(jù)結(jié)構(gòu)不同):hash_map采用hash表存儲(chǔ),map一般采用紅黑樹(shù)(RB Tree)實(shí)現(xiàn)。
(3)map的優(yōu)點(diǎn):可以自動(dòng)按照Key值進(jìn)行排序;hash_map優(yōu)點(diǎn)在于它各項(xiàng)操作的平均時(shí)間復(fù)雜度接近常數(shù),即O(1).
(4)map屬于STL標(biāo)準(zhǔn)的一部分,而hash_map則不是。
2、什么時(shí)候需要用hash_map,什么時(shí)候需要用map?
(1)總體來(lái)說(shuō),hash_map 查找速度會(huì)比map快,而且查找速度基本和數(shù)據(jù)量大小,屬于常數(shù)級(jí)別;而map的查找速度是log(n)級(jí)別。并不一定常數(shù)就比log(n)小,hash還有hash函數(shù)的耗時(shí),明白了吧,如果你考慮效率,特別是在元素達(dá)到一定數(shù)量級(jí)時(shí),考慮考慮hash_map。
(2)但若你對(duì)內(nèi)存使用特別嚴(yán)格,希望程序盡可能少消耗內(nèi)存,那么一定要小心,hash_map可能會(huì)讓你陷入尷尬,特別是當(dāng)你的hash_map對(duì)象特別多時(shí),你就更無(wú)法控制了,而且hash_map的構(gòu)造速度較慢。
【總結(jié)】現(xiàn)在知道如何選擇了嗎?權(quán)衡三個(gè)因素: 查找速度, 數(shù)據(jù)量, 內(nèi)存使用。
3、 如何用hash_map替換程序中已有的map容器?
這個(gè)很容易,但需要你有良好的編程風(fēng)格。建議你盡量使用typedef來(lái)定義你的類(lèi)型:
typedef map

總結(jié)

以上是生活随笔為你收集整理的C++中的hash_map和map的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。