1. 程式人生 > >C++ STL unordered_map和map的使用和效能分析

C++ STL unordered_map和map的使用和效能分析

  • unordered_map是C++ Boost庫中的內容,這裡的unordered翻譯成“無序”。但它並不是完全的“無序”的概念,而是雜湊式的儲存方式。
  • unordered庫提供了兩個雜湊對映類,unordered_map和unordered_multimap。
  • 它們用散列表代替了二叉樹的實現,模板引數多了雜湊計算函式,比較謂詞使用equal_to<>。
    看到這裡,我們就應該明白,比起map/multimap,unordered_map和unordered_mutimap在查詢元素的時候,速度不是一般的快。
    它們的查詢速率是==常數級==的,而==map/multimap是基於二叉樹實現的,所以查詢是O(log n)的複雜度==。

unordered_map屬於關聯式容器,採用std::pair儲存key-value形式的資料。用法與map一致。特別的是,STL中的map因為是==有序==的二叉樹儲存,所以對key值需要有大小的判斷,當使用內建型別時,無需過載operator < ;但是用使用者==自定義型別的話,就需要過載啦==! unoredered_map全程使用不需要比較元素的key值的大小,但是,對於元素的==要有判斷,又因為需要使用hash對映,所以,對於非內部型別,需要程式設計師為其定義這二者的內容,對於內部型別,就不需要了。

  • unordered庫使用“桶”來儲存元素,雜湊值相同的被儲存在一個桶裡。當雜湊容器中有大量資料時,同一個桶裡的資料也會增多,造成訪問衝突,降低效能。為了提高雜湊容器的效能,unordered庫會在插入元素是自動增加桶的數量,不需要使用者指定。但是,使用者也可以在建構函式或者rehash()函式中,指定最小的桶的數量。

map, set, multimap, and multiset

  • 上述四種容器採用紅黑樹實現,紅黑樹是平衡二叉樹的一種。不同操作的時間複雜度近似為:
  • 插入: O(logN)

  • 檢視:O(logN)

  • 刪除:O(logN)

hash_map, hash_set, hash_multimap, and hash_multiset

  • 上述四種容器採用雜湊表實現,不同操作的時間複雜度為:
  • 插入:O(1),最壞情況O(N)。

  • 檢視:O(1),最壞情況O(N)。

  • 刪除:O(1),最壞情況O(N)。