C++中map,hash_map,unordered_map,unordered_set區別與聯繫

一、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那樣有鍵-值對,這裏單純就是爲了方便查詢這些值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章