關聯式容器
標準的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完全相同,唯一的差別在於它允許鍵值重複。