11 4 無序容器

2022-09-25 15:18:09 字數 1750 閱讀 2166

目錄共有四種無序容器:

unorder_set

unorder_map

unorder_multiset

unorder_multimap

有序容器用比較運算子組織元素;無序容器用hash函式關鍵字型別的==組織元素

何時使用:

如果關鍵字本身是無序的,且發現問題可以轉換為用hash技術解決,就應該採用無序容器。

無序容器的操作與有序容器完全一致,只不過加上了hash管理操作無序容器在儲存上組織為一組桶,每個桶儲存零個或多個元素

無序容器使用乙個雜湊函式將元素對映到桶。

為了訪問乙個元素,容器首先計算元素的雜湊值,它指出應該搜尋哪個桶。容器將具有乙個特定雜湊值的所有元素都儲存在相同的桶中。如果容器允許重複關鍵字,所有具有相同關鍵字的元素也都會在同乙個桶中。因此,無序容器的效能依賴於雜湊函式的質量和桶的數量和大小。

對於相同的引數,雜湊函式必須總是產生相同的結果。

理想情況下,雜湊函式還能將每個特定的值對映到唯一的桶。但是,將不同關鍵字的元素對映到相同的桶也是允許的。當乙個桶儲存多個元素時,需要順序搜尋這些元素來查詢我們想要的那個。計算乙個元素的雜湊值和在桶中搜尋通常都是很快的操作。但是,如果乙個桶中儲存了很多元素,那麼查詢乙個特定元素就需要大量比較操作。

無序容器提供了一組管理桶的函式,如表11.8所示。這些成員函式允許我們查詢容器的狀態以及在必要時強制容器進行重組。

預設情況下,無序容器使用關鍵字型別的==運算子來比較元素,它們還使用乙個hash型別的物件來生成每個元素的雜湊值

標準庫為內建型別(包括指標)提供了hash模板。還為一些標準庫型別,包括string 和我們將要在第12章介紹的智慧型指標型別定義了hash。因此,我們可以直接定義關鍵字是內建型別(包括指標型別)、string還是智慧型指標型別的無序容器。

但是,我們不能直接定義關鍵字型別為自定義類型別的無序容器。與容器不同,不能直接使用雜湊模板,而必須提供我們自己的hash模板版本。我們將在16.5節(第626頁)中介紹如何做到這一點。

定義==,和hash函式:

size_t hasher(const sale_data &sd)

bool eqop(const sale_data &lhs, const sale_data &rhs)

用上述函式定義multiset:

using sd_multiset = unorder_multiset;

sd_multiset bookstore(42, hasher, eqop);

如果乙個類型別已經定義了==,只需要過載hash函式:

unorder_setfooset()

STL無序容器

unordered map和unordered set的實現方式為雜湊函式,所以無序關聯容器不會根據key值對儲存的元素進行排序。include using namespace std typedef pair pss int main string s abc u map s 使用下標插入 u m...

STL 無序容器

新標準定義了 4個無序關聯容器。這些容器不是使用比較運算子來組織元素,而是使用乙個雜湊函式和關鍵字型別的 運算子。在元素沒有明顯的序關係的情況下,無序容器是非常有用的。include include using namespace std intmain for auto i unor map re...

無序容器unorder map使用自定義型別

unorder map使用hash函式和關鍵字型別的 運算子來組織元素,使用hash函式將元素對映到桶中,為了訪問乙個元素,容器首先計算元素的雜湊值,他指出應該搜尋那個桶。預設情況下,無序容器使用關鍵字型別的 運算子來比較元素,它還使用乙個hash型別的物件來生成每個元素的雜湊值。標準庫位內建型別提...