关联式容器
标准的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完全相同,唯一的差别在于它允许键值重复。
554

被折叠的 条评论
为什么被折叠?



