STL 關聯容器

2022-08-12 08:09:09 字數 2726 閱讀 5395

c++ primer 第11章

關聯容器和順序容器有根本的不同:關聯容器中的元素是按關鍵字來儲存和訪問的。

關聯容器型別:分為有序和無序

有序:map  關聯陣列;儲存鍵值對

set  關鍵字即值,即只儲存關鍵字的容器

multimap  關鍵字可重複出現的map

multiset  關鍵字可重複出現的set

無序:unordered_map  用雜湊函式組織的map

unordered_set  用雜湊函式組織的set

unordered_multimap  雜湊組織的map,且關鍵字可以重複出現

unordered_multiset  雜湊組織的set,且關鍵字可以重複出現

使用關聯容器:map形式兩個模板引數map,set形式乙個模板引數set。

關聯容器的迭代器都是雙向的。

關聯容器的預設建構函式建立乙個指定型別的空容器,可以列表初始化,對於map的列表初始化:, ....}。

關聯容器的引數:map有2個,set有1個,此時它們的比較函式是預設的,預設比較函式是「<"運算子,可以加上我們自己的比較函式:

setst;

pair型別:

定義在utility標頭檔案中。

有兩個資料成員:first和second。在宣告時指定這兩個成員的型別pairp;

pair操作:

pairp;  p是乙個pair,兩個型別分別為t1和t2的成員都進行了值初始化。

pairp( v1, v2);  p是乙個成員型別為t1和t2的pair;first和second成員分別用v1、v2進行初始化。

pairp=;  等價於pairp;

make_pair(v1, v2);  返回乙個用v1和v2初始化的pair。pair的型別從v1和v2的型別推斷出來。

p.first  返回p的名為first的公有資料成員。

p.second  返回p的名為second的公有資料成員。

p1 relop p2  關係運算子(<,>,<=,>=)按字典序定義:

p1==p2 p1!=p2  當first和second成員分別相等時,兩個pair相等。相等性判斷利用元素的==運算子實現。

關聯容器操作:

key_type  此容器型別的關鍵字型別。

map_type  每個關鍵字關聯的型別;只適用於map。

set的迭代器是const的

有序map和set的新增/刪除操作:insert(emplace)/erase,新增時可以用值、迭代器、列表、迭代器範圍,刪除時可用值、迭代器和迭代器範圍。

map下標操作:和at。

訪問元素:

lower_bound和upper_bound不適用於無序容器。

下標和at操作只適用於非const的map和unordered_map。

c.find(k)  返回乙個迭代器,指向第乙個關鍵字為k的元素,若k不在容器中,則返回尾後迭代器。

c.count(k)  返回關鍵字等於k的元素的數量。對於不允許重複關鍵字的容器,返回值永遠是0或1。

c.lower_bound(k)  返回乙個迭代器,指向第乙個關鍵字不小於k的元素。

c.upper_bound(k)  返回乙個迭代器,指向第乙個關鍵字大於k的元素。

c.equal_range(k)  返回乙個迭代器pair,表示關鍵字等於k的元素範圍。若k不存在,pair的兩個成員均為c.end()。

無序容器:

4個無序容器使用雜湊函式和關鍵字型別的==運算子。在關鍵字型別的元素沒有明顯的序關係的情況下,無序容器非常有用。

無序容器在儲存上組織為一組桶,每個桶儲存零個或多個元素。無序容器使用乙個雜湊函式將元素對映到桶。為了訪問乙個元素,容器首先計算元素的雜湊值,它指出應該搜尋哪個桶。容器將具有乙個特定雜湊值的所有元素都儲存在相同的桶中。因此,無序容器的效能依賴於雜湊函式的質量和桶的數量和大小。

對於相同的引數,雜湊函式產生相同結果。對於不同的引數也可能產生相同結果。當乙個桶儲存多個元素時,需要順序搜尋這些元素來查詢我們想要的那個。

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

無序容器管理操作:

桶介面:

c.bucket_count()  正在使用的桶的數目。

c.max_bucket_count()  容器能容納的最多的桶的數量。

c.bucket_size(n)  第n個桶中有多少個元素。

c.bucket(k)  關鍵字為k的元素在哪個桶中。

桶迭代:

local_iterator  可以用來訪問桶中元素的迭代器型別

const_local_iterator  桶迭代器的const版本

c.begin(n), c.end(n)  桶n的首元素迭代器和尾後迭代器

c.cbegin(n), c.cend(n)  與前兩個函式類似,但返回const_local_iterator

雜湊策略:

c.load_factor()  每個桶的平均元素數量,返回float值

c.max_load_factor()  c試圖維護的平均桶大小,返回float值。c會在需要時新增新的桶,以使得load_factor<=max_load_factor重組儲存,使得bucket_count>=n

c.rehash(n)  重組儲存,使得bucket_count>=n且bucket_count>size/max_load_factor

c.reserve(n)  重組儲存,使得c可以儲存n個元素且不必rehash。

STL 關聯容器

1 關聯容器與順序容器的本質區別 關聯容器通過鍵 key 儲存和讀取元素,而順序容器則通過元素在容器中的位置順序儲存和訪問元素。2 關聯容器的型別 map set multimap multiset 3 pair型別 pair型別的比較 p1 p1 p2 如果兩個pair物件的first和secon...

stl 關聯容器

簡介 對於關聯容器,它的每個元素都有乙個鍵 key 容器中的元素的順序並不能人為隨意決定,而是按照鍵的取值公升序排列的。也就是說,對於乙個關聯容器s,使用迭代器在 s.begin s.end 區間內遍歷,訪問到的序列總是公升序的。分類 按照容器中是否允許出現重複鍵值,關聯容器可分為單重關聯容器和多重...

STL關聯容器

這裡簡單學習一下stl關聯容器,主要是map multimap set multiset以及unordered map。前四個底層實現都是利用紅黑樹實現的,查詢演算法時間複雜度為 o log n 而unordered map從名字上就知道是無序容器,其實現原理類似雜湊表,查詢演算法時間複雜度 o 1...