一、hash_map、unordered_map
這兩個的內部結構都是採用哈希表來實現。區別在哪裏?unordered_map
在C++11的時候被引入標準庫了,而hash_map沒有,所以建議還是使用unordered_map
比較好。
哈希表的好處是什麼?查詢平均時間是O(1)。顧名思義,unordered
,就是無序了。無序容器在存儲上組織爲一組桶,每個桶保存零個或多個元素。無序容器使用一個哈希函數將元素映射到桶。容器將具有一個特定哈希值的所有元素都保存到相同的桶中。如果容器中允許重複關鍵字,所有具有相同關鍵字的元素都會在同一個桶中,因此,無序容器的性能依賴於哈希函數的質量和桶的數量和大小。
二、unordered_map與map
1、內部實現的結構不同,map
使用R-B-tree(紅黑樹)實現的,保證了一個穩定的動態操作時間,查詢、插入、刪除都是O(logN),最壞和平均都是。然而unordered_map
如前所述,是哈希表。順便提一下,哈希表的查詢時間雖然是O(1),但是並不是unordered_map
查詢時間一定比map
短,因爲實際情況中還要考慮到數據量,而且unordered_map
的hash函數的構造速度也沒那麼快.所以不能一概而論,應該具體情況具體分析。
2、map
是按照operator<
比較判斷元素是否相同,以及比較元素的大小,然後選擇合適的位置插入到樹中。所以,如果對map進行遍歷(中序遍歷)的話,輸出的結果是有序的。順序就是按照operator<
定義的大小排序。而unordered_map
是計算元素的Hash值,根據Hash值判斷元素是否相同。所以,對unordered_map
進行遍歷,結果是無序的。
3、用法的區別就是,map
的key需要定義operator<
。 而unordered_map
需要定義hash_value
函數並且重載operator==
。對於內置類型,如string,這些都不用操心。對於自定義的類型做key,就需要自己重載operator==
或者hash_value()
了。
最後,當不需要結果排好序時,最好用unordered_map
。
三、unordered_map與unordered_set
後者就是在哈希表插入value,而這個value就是它自己的key,而不是像之前的unordered_map那樣有鍵-值對,這裏單純就是爲了方便查詢這些值。