【读书笔记】关联式容器
关联式容器每个元素都有一个键值和一个实值(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。