set/multiset/map/multimap/unorder_set/unorder_map

来源:互联网 发布:剑灵捏人完美女神数据 编辑:程序博客网 时间:2024/06/05 06:02

STL容器大致分为两类:
序列式容器—–通过元素在容器中的位置顺序存储和访问元素。
关联式容器—–通过键(key)存储和读取元素的。


标准的STL序列容器包括:vector、list、deque、heap(算法呈现)、stack(适配器)、queue(适配器)、priority_queue(适配器)。
标准的STL关联式容器包括:set、multiset、map、multimap。
非标准的关联式容器:hash_set、hash_multiset、hash_map、hash_multimap


本节主要谈一下关联容器
STL标准库中的关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树红黑树,也称RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,一颗有n个内结点的红黑树的高度至多为2lg(n+1),它能保证在最坏情况下,基本的动态集合操作时间为O(lgn)。所以被STL选择作为了关联容器的内部结构。在红黑树,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值.
注:红黑树使用中序遍历算法,检索效率高于vector、deque和list等容器,另外使用中序遍历可将键值按照从小到大遍历出来。


set/multiset不区分键值和实值,其键值就是实值,会根据待定的排序准则,自动将元素排序。两者唯一的不同在于前者不允许元素重复(底层调rb_tree::insert_unique()),而后者允许(底层调用rb_tree::insert_equal())。
和set相比,map/multimap同时拥有实值(value)和键值(key),其每一个元素都是pair<key,value>,pair的第一个元素是键值,第二个元素是实值。map和multimap的唯一区别在于,map不允许两个元素拥有相同的键值(底层调rb_tree::insert_unique()),而multimap允许存在重复的键值(底层调用rb_tree::insert_equal())。


hash_set、hash_map、hash_multiset、hash_multimap这些非标准的关联容器是基于hashtable的set、map,不具有元素自动排序特性,在C++11中改名为unorder_set,unorder_map,unorder_multiset,unorder_multimap。