STL學習筆記 關聯式容器(二級容器)

2021-08-07 13:00:00 字數 2283 閱讀 2353

關聯式容器

(非線性結構,元素是有序的集合,鍵值儲存)

rb-tree

setmap

multiset

multimap

hashtable

hash_set

hash_map

hash_multiset

hash_multimap

1.rb-tree(二叉平衡搜尋樹,有自動排序功能)

2.set

1)所有的元素都會根據元素的鍵值自動被排序(預設公升序),set元素的鍵值就是實值,set不允許兩個元素有相同的鍵值;

2)set的迭代器為唯讀迭代器,set不允許通過迭代器修改元素值,鍵值無法被修改;

3)由於set底層由rb-tree實現,迭代器相當於指向結點的指標,增刪元素時記憶體並沒有發生「改變」(元素移動),因此指向記憶體的指標不會失效。所以在客戶對它進行增刪操作前後,所有的迭代器都不會失效,被刪除元素的迭代器除外;

4)對於關聯式容器應該使用其自身的find函式來搜尋元素,比stl演算法find更有效率。

3.map

1)所有的元素都會根據元素的鍵值自動被排序(預設公升序);map的所有元素都是pair,同時擁有鍵值和實值;

map不允許兩個元素有相同的鍵值;

2)map允許通過迭代器修改元素值,但鍵值無法被修改(會影響元素的排列規則);

3)由於map底層由rb-tree實現,迭代器相當於指向結點的指標,增刪元素時記憶體並沒有發生「改變」(元素移動),因此指向記憶體的指標不會失效。所以在客戶對它進行增刪操作前後,所有的迭代器都不會失效,被刪除元素的迭代器除外;

4)對於關聯式容器應該使用其自身的find函式來搜尋元素,比stl演算法find更有效率。

4.multiset允許元素的鍵值重複

5.multimap允許元素的鍵值重複

6.hashtable(無自動排序功能)

1)sgi-stl的hashtable使用開鏈法來解決衝突,採用雜湊桶結構來儲存結點,由vector和list-node組成

2)hashtable的迭代器型別為forwarditerator,沒有後退操作;

3)hashtable的迭代器必須永遠維繫著與整個「buckets vector」的關係,並記錄目前所指的結點。(與deque類似)

4)sgi-stl採用質數來設計**大小(即vector大小),先將28個質數(大小逐漸呈現兩倍的關係)存入乙個陣列;

同時提供乙個函式,用來查詢在這28個質數之中,「最接近某數並大於某數」的質數。lower_bound()、upper_bound()

5)bucket(list)的容量即buckets[i]的容量,就是buckets的大小(即vector的大小);當元素數量超過容量時,**會重建

重新申請乙個vector,將原來的元素copy過來,然後釋放原來的空間;

6)hashtable預設只能處理char,char*,const char*,int(unsinged int),short(unsinged short),long(unsinged long)型別

資料,欲處理上述型別之外的型別需要使用者自定義hash function.

7.hash_set

hash_set底層由hashtable實現,除沒有自動排序功能外,其餘使用方法與set一致;

8.hash_map

hash_map底層由hashtable實現,除沒有自動排序功能外,其餘使用方法與map一致;

9.hash_multiset

10.hash_multimap

11.hash_map與map的使用注意

1)hash_map的底層是hashtable,理論上的平均操作複雜度是常數時間o(1);map的底層是rb-tree,理論上的操作平均複雜度是o(logn);

2)選用hash_map還是map,關鍵在於關鍵字的查詢次數,以及關注的是整體查詢時間還是單詞查詢時間;

若查詢次數多,要求整體的查詢效率,用hash_map;

若查詢次數少,由於hashtable會有不確定的o(n),會影響整體效率,因此選map;

STL關聯式容器(二)

前面我們總結了map的用法,具體參考如下 stl關聯式容器 一 接下來我們看看multimap multimap是關聯式容器,它按照特定的順序,儲存由key和value對映成的鍵值對,其中多個鍵值對之間的key是可以重複的。multimap在底層用二叉搜尋樹 紅黑樹 來實現。multimap和map...

STL學習筆記 關聯容器

stl中常用的關聯容器有四種 set map mutimap multiset。這四種容器中的元素都是按照鍵有序排列的,因此關聯容器的鍵值必須是可比較的。如果鍵值是基本型別可以直接使用,如果鍵值是自定義型別,需要定義帶有比較謂詞的建構函式map中儲存著一系列的鍵值對兒,每個鍵對應乙個值,鍵類似有索引...

stl之關聯容器學習筆記1

概述 stl定義了另一種容器,名曰關聯容器,關聯容器和順序容器的本質區別在於 關聯容器通過鍵key來儲存和讀取元素,而順序容器則通過元素在容器中的位置順序儲存和訪問元素。關聯容器的大部分行為與順序容器相同,但其獨特之處在於支援鍵的使用。stl提供了兩個基本的關聯容器 1 map 容器中以鍵值的形式來...