C++ 標頭檔系列(unordered_map、unordered_set)

來源:互聯網
上載者:User

標籤:function   如何   一次函數   元素   

簡介

很明顯,這兩個標頭檔分別是map、set標頭檔對應的unordered版本。 所以它們有一個重要的性質就是:

  • 亂序

如何亂序

這個unorder暗示著,這兩個標頭檔中類的底層實現----Hash。 也是因為如此,你才可以在聲明這些unordered模版類的時候,傳入一個自訂的雜湊函數,準確的說是雜湊函數子(hash function object)。

具有相同相同雜湊值的元素被放在同一個桶(bucket)中。

為何亂序

在提供映射、集合功能的情況下,側重於元素的快速擷取

用樹結構(紅/黑樹狀結構、二叉搜尋樹等)實現的map、set,在尋找、擷取、修改元素的時候,通常需要從根結點自上而下一次遍曆樹結構,因此時間複雜度為線性 ; 而通過雜湊表實現, 只要雜湊函數以及桶的大小選取得當,時間複雜度會是常數(只需要調用一次函數,並進行小幅度的尋找)。

單向迭代器

雜湊表的實現複雜了該容器上的雙向遍曆,似乎沒有一種合適的方法能夠做到高效快速。 因此,unorder版本的map和set只提供前向迭代器(非unorder版本提供雙向迭代器)。

少了什麼函數
  • lower_bound

  • upper_bound

普通版本的map和set,它們是有序容器,對每一個元素都能都能判斷它應該在哪個之前、在哪個之後; 而該版本的容器則不一樣,因為它們是亂序的,不能確定每個元素的先後順序。 因此,容器沒有足夠的資訊來計算這兩個邊界(然而元素的相等性比較依舊是可行的)。

多了什麼函數

出於實現的概念,該版本的類模版必不可少的多了些特殊的函數。

桶相關(Bucket)
  • bucket_count : 桶數量。

  • max_bucket_count : 最大桶數量。

  • bucket_size : 桶大小,即容量。

  • bucket : 定位給定元素的桶位置。

雜湊策略
  • load_factor : 返回load factor,即容器當前元素數量與桶數量之比

  • max_load_factor : 返回或設定最大load factor。

  • rehash : 設定桶的數量,並重新對元素進行雜湊映射。

  • reserve : 請求保留桶的數量至給定值。

注意到,沒有函數能改變桶的容量,可能桶也是動態增長的

Observers
  • hash_function : 返回雜湊函數(在聲明時作為參數傳入,或預設的位於funtional標頭檔中的hash)。

  • key_eq : 返回key的相等性謂詞,情況與hash_function相似。


C++ 標頭檔系列(unordered_map、unordered_set)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.