第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 iset1;
set iset2(ia,ia+5);
//插入元素
iset2.insert(3);
//删除元素
iset2.erase(1);
//计数
iset2.count(3);
//查找
//1.此方法效率低,因为此只循序搜寻。
set::iterator iter1 = find(iset2.begin(),iset2.end(),3); 
//2.此方法效率较高,二叉查找树
set::iterator iter2 = iset2.find(3);
//不可以试图通过迭代器来改变set元素
*iter1 = 10;        ///error

3 map

1)map的特性是,所有的元素都会根据元素的键值自动被排序。map的所有元素都是pair,同时拥有第二键值:实值(value)和第一元素:键值(key)。

template 
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完全相同,唯一的差别在于它允许键值重复。

第4篇 关联式容器(associative)_第1张图片
第4篇 关联式容器(associative)_第2张图片
第4篇 关联式容器(associative)_第3张图片
第4篇 关联式容器(associative)_第4张图片

你可能感兴趣的:(STL源码剖析)