【读书笔记】关联式容器

关联式容器每个元素都有一个键值和一个实值(set键值就是实值),关联式容器没有所谓头尾。一般而言,关联式容器的内部结构是一个平衡二叉树。

二叉搜索树:任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每个节点的键值。

RB-tree(红黑树)规则:

1、  每个节点不是红色就是黑色。

2、  根节点为黑色。

3、  如果节点为红,其子节点必须为黑。

4、  任一节点至NULL的任何路径,所含之黑节点数必须相同。

set,所有元素都会根据元素的键值自动被排序。set元素的键值就是实值。set不允许两个元素有相同的键值。

不能通过迭代器修改set的元素值,因为set的元素值就是其键值,关系到set元素的排列规则。如果任意改变set的元素值,会破坏set组织。

当客户端对set进行元素新增操作或删除操作时,操作之前的迭代器在操作之后依然有效。

map,所有元素都会根据元素的键值自动被排序。map的所有元素都是pair,同时拥有实值和键值。不允许两个元素拥有相同的键值。

不能通过迭代器修改map的键值,但可以修改其实值。

当客户端对map进行元素新增操作或删除操作时,操作之前的迭代器在操作之后依然有效。

map的insert操作返回一个pair,由一个迭代器和一个bool值组成,后者表示插入是否成功,如果成功,前者即指向被插入的那个元素。

下标操作即可以作为左值也能被作为右值。其实现是调用insert,并返回插入后的实值的引用。

1 T& operator[] (const key_type& k)
2 {
3     return (*((insert(value_type(key, T()))).first)).second;
4 }
5 
6  (*((insert(value_type(key, T()))).first)).second //这个实值以引用方式返回,所以作为左值和右值都可以。

multiset,特征与用法与set一致,唯一的区别在于允许键值重复。

multimap,特征与用法与map一致,唯一的区别在于允许键值重复。

hashtable可视为一种字典结构。这种结构提供常数时间之基本操作。

元素映射时发生碰撞可以通过线性探测、二次探测、开链等做法解决。

hash_set 以hashtable为底层的set。

hash_map以hashtable为底层的map。

hash_multiset以hashtable为底层的multiset。

原文地址:https://www.cnblogs.com/zhiqli/p/3106001.html