C 容器(三)關聯容器

2021-08-19 15:59:42 字數 1558 閱讀 6865

set, multiset, map, multimap

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

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

(1)set

,又稱集合,實際上就是一組元素的集合,但

其中所包含的元素的值是唯一的

,且是按一定順序排列

的,集合中的每個元素被稱作集合中的例項。因為其

內部是通過鍊錶的方式來組織

,所以在插入的時候比vector 快,但在查詢和末尾新增上被vector 慢

。(2)multiset

,是多重集合,其實現方式和set 是相似的,只是它

不要求集合中的元素是唯一的,也就是說集合中的同乙個元素可以出現多次

。(3)map

,提供一種「key- value」關係的一對一的資料儲存能力

。其「鍵」在容器中不可重複,且按一定順序排列

(其實我們可以將set 也看成是一種鍵- 值關係的儲存,只是它只有鍵沒有值。它是map 的一種特殊形式)。由於其是按鍊錶的方式儲存,它也繼承了鍊錶的優缺點。

(4)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] 方式)

三 關聯式容器 有序

標籤 空格分隔 c stl 關聯式容器是關聯式陣列概念的推廣 依據特定的排序規則,自動為其元素排序 由二叉樹實現 提供對元素的快速訪問 主要的有序關聯式容器有 set 關鍵字和資料檔案是同乙個值。具有唯一性 multiset 類似,但是包含重複的元素 map 成對資料的容器。鍵值對,唯一性 mult...

C 容器 關聯式容器

由於multimap和map相差不大,所以基本以map做練習 集合 map 是一種包含已 排序 公升序 物件的關聯 容器。map multimap會根據待定的排序準則,自動將元素排序。兩者不同在於前者不允許元素重複,而後者允許。集合元素的第乙個引數是key,第二個元素當做value,元素的順序與ke...

c 關聯容器

1.map建構函式 mapm 普通初始化 mapm m2 複製初始化法 mapm b,e 另乙個map物件的迭代器初始化法 注意 1 鍵值型別必須定義 操作符號,資料訪問時需要呼叫。2 m aaa 下表訪問方式導致的結果是,若鍵對應的值不存在,則插入該鍵值對應的預設值。2.map插入操作 m.ins...