一纵搁、map和unordered_map的區(qū)別
(1)需要引入的頭文件不同
map: #include <map>
unordered_map: #include <unordered_map>
(2)內(nèi)部實現(xiàn)機理不同
<1>map
map內(nèi)部實現(xiàn)了一個紅黑樹(紅黑樹是非嚴(yán)格平衡二叉搜索樹吃衅,而AVL是嚴(yán)格平衡二叉搜索樹),紅黑樹具有自動排序的功能腾誉,因此map內(nèi)部的所有元素都是有序的徘层,紅黑樹的每一個節(jié)點都代表著map的一個元素。因此利职,對于map進行的查找趣效,刪除,添加等一系列的操作都相當(dāng)于是對紅黑樹進行的操作猪贪,其時間復(fù)雜度都是O(logn)
跷敬,最壞和平均都是。map中的元素是按照二叉搜索樹(又名二叉查找樹热押、二叉排序樹西傀,特點就是左子樹上所有節(jié)點的鍵值都小于根節(jié)點的鍵值,右子樹所有節(jié)點的鍵值都大于根節(jié)點的鍵值)存儲的桶癣,使用中序遍歷可將鍵值按照從小到大遍歷出來拥褂。
<2>unordered_map
unordered_map內(nèi)部實現(xiàn)了一個哈希表(也叫散列表,通過把關(guān)鍵碼值映射到Hash表中一個位置來訪問記錄鬼廓,查找的時間復(fù)雜度可達到O(1)肿仑,其在海量數(shù)據(jù)處理中有著廣泛應(yīng)用)。因此碎税,其元素的排列順序是無序的尤慰。但是并不是unordered_map查詢時間一定比map短,因為實際情況中還要考慮到數(shù)據(jù)量雷蹂,而且unordered_map的hash函數(shù)的構(gòu)造速度也沒那么快伟端,所以不能一概而論,應(yīng)該具體情況具體分析匪煌。
hash_map
和unordered_map
的底層實現(xiàn)是一樣的责蝠,但是在C++11中將unordered_map引入了標(biāo)準(zhǔn)庫,而hash_map沒有萎庭,所以建議還是使用unordered_map比較好霜医。
unordered_set
就是在哈希表插入value,而這個value就是它自己的key驳规。
(3)優(yōu)缺點
<1>map
- 優(yōu)點
(1)有序性肴敛,這是map結(jié)構(gòu)最大的優(yōu)點,其元素的有序性在很多應(yīng)用中都會簡化很多的操作;
(2)紅黑樹医男,內(nèi)部實現(xiàn)一個紅黑書使得map的很多操作在logn
的時間復(fù)雜度下就可以實現(xiàn)砸狞,因此效率非常的高 - 缺點
空間占用率高,因為map內(nèi)部實現(xiàn)了紅黑樹镀梭,雖然提高了運行效率刀森,但是因為每一個節(jié)點都需要額外保存父節(jié)點、孩子節(jié)點和紅/黑性質(zhì)报账,使得每一個節(jié)點都占用大量的空間研底。
<2>unordered_map
- 優(yōu)點
因為內(nèi)部實現(xiàn)了哈希表,因此其查找速度非常的快笙什。 - 缺點
哈希表的建立比較耗費時間飘哨。
(4)適用性
<1>map
對于那些有順序要求的問題,用map會更高效一些
<2>unordered_map
對于查找問題琐凭,unordered_map會更加高效一些芽隆,因此遇到查找問題,常會考慮一下用unordered_map统屈。
對于unordered_map
或unordered_set
容器胚吁,其遍歷順序與創(chuàng)建該容器時輸入的順序不一定相同,因為遍歷是按照哈希表從前往后依次遍歷的愁憔。
(5)使用
unordered_map的用法和map完全是一樣的腕扶,提供了 insert,size吨掌,count半抱,find等操作,并且里面的元素也是以pair類型來存貯的
膜宋。其底層實現(xiàn)是完全不同的窿侈,上方已經(jīng)解釋了,但是就外部使用來說卻是一致的
二秋茫、map和multimap的區(qū)別
multimap容器保存的是有序的鍵/值對史简,但是可以保存重復(fù)的元素。multimap中會出現(xiàn)具有相同鍵值的元素序列肛著。multimap大部分成員函數(shù)的使用方式和map相同圆兵。因為重復(fù)鍵的原因,multimap有一些函數(shù)的使用方式和map有一些區(qū)別枢贿。
<1>訪問元素
multimap
不支持下標(biāo)運算符殉农,因為鍵并不能確定一個唯一元素。和 map 相似局荚,multimap 也不能使用 at()
函數(shù)统抬。
<2>刪除元素
- 以待刪除元素的迭代器作為參數(shù),這個函數(shù)沒有返回值;
-
erase()
函數(shù)以一個鍵作為參數(shù)聪建,它會刪除容器中所有含這個鍵的元素,返回容器中被移除元素的個數(shù) - 接受兩個迭代器參數(shù)茫陆,這個范圍內(nèi)的所有元素都會被刪除金麸。
<3>count函數(shù)
multimap 的成員函數(shù) count() 可以知道有多少個元素的鍵和給定的鍵相同。
三簿盅、unordered_multimap
在該數(shù)據(jù)結(jié)構(gòu)里面的元素沒有順序挥下,并且可以有多個key值相同。