第4篇 關聯式容器(associative)

關聯式容器

標準的STL關聯式容器分爲set(集合)和map(映射表)兩大類,以及這兩大類的衍生體multiset(多鍵集合)和multimap(多鍵映射表)。這些容器的底層機制均以RB-tree完成。

SGI STL還提供了一個不在標準規格之列的關聯式容器:hash table(散列表),以及以此爲底層機制而完成的hash_set(散列集合)、hash_map(散列映射表)、hash_multiset(散列多鍵集合)、hash_multimap(散列多鍵映射表)。

關聯式容器:每個元素都有一個鍵值(key)和一個實值(value)。當元素被插入到關聯式容器中時,容器內部結構(可能是RB-tree,也可能是hash-table)便依照其鍵值大小,以某種特定規則將這個元素放置與適當位置。

1 樹的簡介

二叉樹:一個二叉樹如果不爲空,便是一個根節點和左右兩子樹構成;左右子樹都可能爲空。

二叉搜索樹:任何節點的鍵值一定大於其左子樹中的每一個節點的鍵值、並小於其右子樹中的每一個節點的鍵值。

平衡二叉搜索樹:AVL-tree、RB-tree、AA-tree。

AVL-tree:任何節點的左右子樹高度相差最多1.

RB-tree:這裏算法裏會詳細介紹。

2 set

1) set的特性是所有元素都會根據元素的鍵值自動被排序;而且set元素的鍵值就是實值,是實值就是鍵值。set不允許兩個元素有相同的鍵值。

2)set不允許通過迭代器來改變元素的值。因爲set::iterator被定義爲底層RB-tree的const_iterator。

3)STL特別提供了一組set/multiset相關算法,包括交集set_intersection、聯集set_union、差集set_difference、對稱差集set_symmetric_difference

4)map的常用操作

//構造對象
int ia[5] = {0,1,2,3,4};
set<int> iset1;
set<int> iset2(ia,ia+5);
//插入元素
iset2.insert(3);
//刪除元素
iset2.erase(1);
//計數
iset2.count(3);
//查找
//1.此方法效率低,因爲此只循序搜尋。
set<int>::iterator iter1 = find(iset2.begin(),iset2.end(),3); 
//2.此方法效率較高,二叉查找樹
set<int>::iterator iter2 = iset2.find(3);
//不可以試圖通過迭代器來改變set元素
*iter1 = 10;        ///error

3 map

1)map的特性是,所有的元素都會根據元素的鍵值自動被排序。map的所有元素都是pair,同時擁有第二鍵值:實值(value)和第一元素:鍵值(key)。

template <class _T1, class _T2>
struct pair {
  typedef _T1 first_type;
  typedef _T2 second_type;

  _T1 first;
  _T2 second;
  pair() : first(_T1()), second(_T2()) {}
  pair(const _T1& __a, const _T2& __b) : first(__a), second(__b) {}
};

2)map的迭代器允許改變元素的實值,但是不可以改變元素的鍵值(因爲Map的鍵值關係到map元素的排列規則)

4 multiset

multiset的特性以及用法和set完全相同,唯一的差別在於它允許鍵值重複。

4 multimap

multimap的特性以及用法和map完全相同,唯一的差別在於它允許鍵值重複。

這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章