STL系列 7 關聯容器特點

2021-06-29 09:58:42 字數 1419 閱讀 9955

set, multiset, map, multimap 是一種非線性的樹結構,具體的說採用的是一種比較高效的特殊的平衡檢索二叉樹—— 紅黑樹結構。

因為關聯容器的這四種容器類都使用同一原理,所以他們核心的演算法是一致的,但是它們在應用上又有一些差別,先描述一下它們之間的差別。

set 又稱集合,實際上就是一組元素的集合,但其中所包含的元素的值是唯一的,且是按一定順序排列的,集合中的每個元素被稱作集合中的例項。因為其內部是通過鍊錶的方式來組織,所以在插入的時候比vector 快,但在查詢和末尾新增上比vector 慢。 

multiset 是多重集合,其實現方式和set 是相似的,只是它不要求集合中的元素是唯一的,也就是說集合中的同乙個元素可以出現多次。 

map 提供一種「鍵- 值」關係的一對一的資料儲存能力。其「鍵」在容器中不可重複,且按一定順序排列(其實我們可以將set 也看成是一種鍵- 值關係的儲存,只是它只有鍵沒有值。它是map 的一種特殊形式)。由於其是按鍊錶的方式儲存,它也繼承了鍊錶的優缺點。  

multimap 和map 的原理基本相似,它允許「鍵」在容器中可以不唯一。  

關聯容器的特點是明顯的,相對於順序容器,有以下幾個主要特點:  

1、其內部實現是採用非線性的二叉樹結構,具體的說是紅黑樹的結構原理實現的;  

2、set 和map 保證了元素的唯一性,mulset 和mulmap 擴充套件了這一屬性,可以允許元素不唯一;  

3、元素是有序的集合,預設在插入的時候按公升序排列。 

基於以上特點,  

1、關聯容器對元素的插入和刪除操作比vector 要快,因為vector 是順序儲存,而關聯容器是鏈式儲存;比list 要慢,是因為即使它們同是鏈式結構,但list 是線性的,而關聯容器是二叉樹結構,其改變乙個元素涉及到其它元素的變動比list 要多,並且它是排序的,每次插入和刪除都需要對元素重新排序;  

2、關聯容器對元素的檢索操作比vector 慢,但是比list 要快很多。vector 是順序的連續儲存,當然是比不上的,但相對鏈式的list 要快很多是因為list 是逐個搜尋,它搜尋的時間是跟容器的大小成正比,而關聯容器 查詢的複雜度基本是log(n) ,比如如果有1000 個記錄,最多查詢10 次,1,000,000 個記錄,最多查詢20 次。容器越大,關聯容器相對list 的優越性就越能體現;  

3、在使用上set 區別於vector,deque,list 的最大特點就是set 是內部排序的,這在查詢上雖然遜色於vector ,但卻大大的強於list 。  

4、在使用上map 的功能是不可取代的,它儲存了「鍵- 值」關係的資料,而這種鍵值關係採用了類陣列的方式。陣列是用數字型別的下標來索引元素的位置,而map 是用字元型關鍵字來索引元素的位置。在使用上map 也提供了一種類陣列操作的方式,即它可以通過下標來檢索資料,這是其他容器做不到的,當然也包括set 。(stl 中只有vector 和map 可以通過類陣列的方式操作元素,即如同ele[1] 方式)

STL系列 關聯容器的操作

在c 中定義了幾種型別用來表示容器關鍵字和值的型別。對於set,由於儲存的值就是關鍵字,所以,key type和value type是一樣的。set的迭代器是const的!對於set,find呼叫返回的是乙個迭代器,如果我們所給定的關鍵字在set中的時候,迭代器就指向該關鍵字,否則,find返回尾後...

STL 關聯容器

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

stl 關聯容器

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