关联容器不同于顺序容器的是,顺序容器底层用数组实现,为线性结构,而关联容器在实现中,用到的非线性存储方式;顺序容器是通过元素在容器中的位置顺序存储和访问元素,而关联容器是通过键(key)存储和读取元素的。c++标准模板库中,关联容器有set、multiset、map、multimap.
1.底层原理 我们已经说过,关联容器底层实现是用非线性存储方式,那么这种非线性存储方式是什么呢?答案是"红黑树"(RB-Tree),红黑树是平衡二叉树的一种,其有以下特点: (1)所有左子树结点的值小于等于根节点的值,右子树节点的值大于根节点的值。 (2)没有一个节点深度过大。 通过上面,就可以知道,关联容器是平衡二叉树的具体应用,因为其内部是通过链表的方式组织,所以在插入的时候比vector要快,比list要慢;由于其底层是平衡二叉树,查找、插入、删除时间复杂度都应该为O(logN. 2.set set就是一个集合,组内的元素是唯一的,并且按一定的顺序排列。每个元素可以看成一个键或者一个值 3.multiset multiset与set的唯一区别是,支持一个键多次出现。 4.map map同时拥有实值(value)和键值(key),其每一个元素都是pair,pair的第一个元素是键值,第二个元素是实值。键用作元素在 map 中的索引,而值则表示所存储和读取的数据 5.multimap map不允许两个元素拥有相同的键值,而multimap允许存在重复的键值。 6.关联容器的选择 map和set的底层实现都是很RB-tree,这两种类型的对象所包含的元素都具有不同的键,不允许为同一个键添加第二个元素。 如果一个键必须对应多个实例,则需使用 multimap 或 multiset,这两种类型允许多个元素拥有相同的键。 关联容器中,只有map支持下表操作。 一般来说,如果希望有效地存储不同值的集合,那么使用 set 容器比较合适,而 map 容器则更适用于需要存储(乃至修改)每个键所关联的值的情况。