C++、STL标准模板库和泛型编程——关联式容器 (侯捷)( 持续更新!!!)
- 关联式容器
- rb_tree 容器
- set、multiset 容器
- map、multimap容器
C++、STL标准模板库和泛型编程——序列式容器 (侯捷)
关联式容器
关联式容器,通过key来找值,查找速度非常快,可以看成是小型数据库。
关联容器:set、multiset、map、multimap,实现是使用 红黑树(高度平衡二叉树)
set的key既是key也是value。

C++11中有Unordered容器,但他也属于关联容器,实现使用hash table做的

rb_tree 容器
Red-Black tree(红黑树)是平衡二叉搜索树(balanced binary search tree)中常被使用的一种。平衡二叉搜索树的特征:排列规则有利search 和insert,并保持适度平衡——无任何节点太深。

rb_tree 提供“遍历”操作及iterators.
- 按正常规则(
++ite)遍历。便能获得排序状态(sorted)。
我们不应使用rb_tree的iterators改变元素值(因为元素有其严谨排序规则)。编程层面(programming leve)并未阻止此事。
- 如此设计是正确的,因为
rb_tree即将为set和map服务(作为其底层支持); - 而
map允许元素的data被改变,只有元素的key才是不可以改变的。 rb_tree提供两个insertion操作:insert_unique()和insert_equal()。前者表示节点的key一定是在整个tree中独一无二,否则安插失败(对红黑树没有任何影响);后者表示节点的key可以重复。
使用红黑树,有5个模板参数:

红黑树和双向链表都有一个不用的节点,双向链表是end后面的节点,红黑树是头节点。
第三个模板参数是指定如何取出key:

set、multiset 容器
set/multiset以rb_tree为底层结构,因此有【元素自动排序】特性。
- 排序的依据是
key,而set/multiset元素的value和key合一:value就是key。 set/multiset提供“遍历”操作及iterators;按正常规则(++ite)遍历,便能获得排序状态(sorted)。- 我们无法使用
set/multiset的iterators改变元素值(因为key有其严谨的排序规则)。set/multiset的iterators是其底部的RB_tree的const-iterator,就是为了禁止user对元素赋值。 set元素的key必须独一无二,因此其insert()用的是rb_tree的insert_unique()。multiset元素的key可以重复,因此其insert()用的是rb_tree的insert_equal()。


multimap
multiset<int> c;
c.insert(2);//会放在该放置的位置,放进去就会被排序
c.begin();
c.end();
c.size();
c.max_size();
c.find(target);//内置find,红黑树
map、multimap容器
map/multimap以rb_tree为底层结构,因此有【元素自动排序】特性。
- 排序的依据是
key。 map/multimap提供“遍历”操作及iterators;按正常规则(++ite)遍历,便能获得排序状态(sorted)。- 我们无法使用
map/multimap的iterators改变元素的key(因为key有其严谨的排序规则)。但可以用它来改变元素的data。因此map/multimap内部自动将user指定的keytype设定为const,如此便能禁止user对元素的key赋值。 map元素的key必须独一无二,因此其insert()用的是rb_tree的insert_unique()。multimap元素的key可以重复,因此其insert()用的是rb_tree的insert_equal()。


map可以通过下标[]来插入:




















