【C++从内部结构到应用】

    关联容器不同于顺序容器的是,顺序容器底层用数组实现,为线性结构,而关联容器在实现中,用到的非线性存储方式;顺序容器是通过元素在容器中的位置顺序存储和访问元素,而关联容器是通过键(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 容器则更适用于需要存储(乃至修改)每个键所关联的值的情况。

 

 

posted @ 2013-09-28 10:19  来自你520的末班车  阅读(147)  评论(0编辑  收藏  举报