C STL中的關聯式容器

2021-10-14 03:10:38 字數 1532 閱讀 6368

stl中的容器,比如:vector、list、deque、forward_list(c++11)等,這些容器統稱為序列式容器,因為其底層為線性序列的資料結構,裡面儲存的是元素本身。

關聯式容器也是用來儲存資料的,與序列式容器不同的是,其裡面儲存的是結構的鍵值對,在資料檢索時比序列式容器效率更高。

樹形結構的關聯式容器主要有四種:map、set、multimap、multiset。這四種容器的共同特點是:使用平衡搜尋樹(即紅黑樹)作為底層實現,容器中的元素是乙個有序的序列

map中的元素是鍵值對

map中的key是唯一的,並且不能修改

預設按照小魚的方式對key進行比較

map中的元素如果用迭代器去便利,可以得到乙個有序的序列

map的底層為平衡搜尋樹(紅黑樹),查詢效率比較高o(long2n)

支援[ ]操作符,operator[ ]中實際進行插入查詢

map中operator[ ]的原理是:

用構造乙個鍵值對,然後呼叫insert()函式將該鍵值對插入到map中

如果key已經存在,插入失敗,insert函式返回該key所在位置的迭代器

如果key不存在,插入成功,insert函式返回新插入元素所在位置的迭代器

operator[ ]函式最後將insert返回值鍵值對中的value返回。

multimap儲存由key和value對映成的鍵值對,其中多個鍵值對之間的key是可以重複的

multimap中的元素預設將key按照小於來比較

multimap中沒有過載operator[ ]操作

使用時與map包含的標頭檔案相同

set中只放value,但在底層實際存放的是由構成的鍵值對

set中插入元素時,只需要插入value即可,不需要構造鍵值對

set中的元素不可以重複(因此可以使用set進行去重)

使用set的迭代器遍歷set中的元素,可以得到有序序列

set中的元素預設按照小於來比較

set中查詢某個元素,時間複雜度為:log2n

set中的元素不允許修改

set中的底層使用二叉搜尋樹(紅黑樹)來實現

multiset中在底層中儲存的是的鍵值對

multiset中的插入介面中只需要插入即可

與set的區別是,multiset中的元素可以重複,set中value是唯一的

使用迭代器對multiset中的元素進行遍歷,可以得到有序的序列

multiset中的元素不能修改

在multiset中找某個元素,時間複雜度為o(log2n)

multiset的作用:可以對元素進行排序

在c++98中,stl提供了底層為紅黑樹結構的一系列關聯式容器,在查詢時效率可達到log2n,即最差情況下需要比較紅黑樹的高度次,當樹中的節點非常多時,查詢效率也不理想。最好的查詢是,進行很少的比較次數就能夠將元素找到,因此在c++11中,stl又提供了雜湊結構的關聯式容器,分別是unordered_map、unordered_set、unordered_multimap、unordered_multiset

C STL 26 關聯式容器set用法

set容器都會自行根據鍵的大小對儲存的鍵值對進行排序,只不過 set 容器中各鍵值對的鍵 key 和值 value 是相等的,根據 key 排序,也就等價為根據 value 排序。另外,使用 set 容器儲存的各個元素的值必須各不相同。更重要的是,從語法上講 set 容器並沒有強制對儲存元素的型別做...

關聯式容器

關聯式容器是用來儲存資料的,與序列式容器不同的是,其儲存的是結構的鍵值對,在資料檢索時比序列式容器效率更高。鍵值對 用來表示具有一一對應關係的結構,該結構中一般只含兩個成員變數key和value,key代表鍵值,value表示與key對應的資訊。比如 現在要建立乙個英漢互譯的字典,那該字典中必然有英...

C STL中的容器

用c 寫資料結構習題也有一段時間了,不得不說stl容器對資料結構真的很有用。c stl standard template library,標準模板庫 是一套功能強大的 c 模板類,其中包含4個元件,分別為演算法 容器 函式 迭代器。所以想總結一下自己用的容器,為什麼要用它以及怎麼用?c c 原生的...