根据不同的应用场景,STL中包含有两种不同结构的管理式容器:树型结构与哈希结构,树型结构的关联式容器主要有四种:map,set,multimap,multiset,但是这四种容器底层都使用平衡搜索树且容器中的元素是一个有序的序列。
一、map
map按照特定的次序存储由键值Key和值Value组合而成的元素,其中键值Key是用来排序和唯一的标识元素,Value中存储于Key关联的内容,在 map的内部,键值Key与值Value通过成员类型value_type绑定在一起,称为pair,即键值对。键值Key的比较通常是用小于来比较的。
map通常被实现为平衡搜索二叉树(红黑树),这是因为红黑树不追求绝对平衡,只需要保证最长路径不超过最短路径的2倍,相对于AVL而言,降低了插入和旋转的次数,其实现较为简单。
map的使用也就集中在它的增删查改,其中在使用增加的函数的时候可以进行类型重定义,来减少代码的书写;删除的时候由于使用方法的不用容易发生崩溃;而修改的则是pair的值Value,键值Key是const的,不能进行修改。map支持[]操作符,operator[]中实际进行插入查找,但是map并没有重载输出cout。
二、multimap
multimap基本上与map是一致的,唯一的区别就是multimap中的Key是可以重复的,而map中的Key是唯一的。
在使用上multimap是没有重载operator[]的,这是因为multimap的键值Key是不唯一的,若通过operator[]进行查找则不会进行正确的映射。
三、set
set是按照一定次序存储元素的容器,在set中元素的Value一是存储内容,二是进行标识,也就是说Value就是Key,所以不能修改,但是可以插入或删除它们。 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
虽然set中只存放Value,但底层的红黑树存放的是由<Valeue, Value>构成的键值对,但是插入元素时只需要插入value即可,而且set中的元素不可以重复,默认按照小于来比较。
set一般用来判断在不在的时候效率较高或者进行排序 + 去重。set查找元素的时间复杂度为O(log_2 N)。
四、multiset
与set基本一致,只是multiset中的元素时可以重复的,其实就是底层的红黑树经过改造提供两个接口:①insert_unique set
②insert_equal multiset
,multiset可以用来进行排序等等根据特性来具体使用。
但是multiset和set的使用有一个劣势就是需要编程人员提前知道所要开辟空间的大小,这点限制了它得使用。
五、关于AVL树和红黑树
由于二叉搜索树在极端情况下的效率变低,所以就产生了AVL树和红黑树。AVL树的左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)是一种绝对平衡;红黑树满足①每个结点不是红色就是黑色②根节点是黑色的③如果一个节点是红色的,则它的两个孩子结点是黑色的④对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点⑤每个叶子结点都是黑色的(此处的叶子结点指的是空结点),这样就能保证最长路径中的节点个数不会超过最短路径的2倍,是一种近似平衡。