STL学习笔记——关联式容器(二级容器)

来源:互联网 发布:网络管理视频教程下载 编辑:程序博客网 时间:2024/06/06 04:58
关联式容器非线性结构,元素是有序的集合,键值存储
    RB-tree
 set
 map
 multiset
 multimap
    hashtable
 hash_set
 hash_map
 hash_multiset
 hash_multimap

1.RB-tree(二叉平衡搜索树,有自动排序功能)
2.set
    1)所有的元素都会根据元素的键值自动被排序(默认升序),set元素的键值就是实值,set不允许两个元素有相同的键值;
    2)set的迭代器为只读迭代器,set不允许通过迭代器修改元素值,键值无法被修改;
    3)由于set底层由RB-tree实现,迭代器相当于指向结点的指针,增删元素时内存并没有发生“改变”(元素移动),因此指向内存的指针不会失效。所以在客户对它进行增删操作前后,所有的迭代器都不会失效,被删除元素的迭代器除外;
    4)对于关联式容器应该使用其自身的find函数来搜寻元素,比STL算法find更有效率
3.map          
    1)所有的元素都会根据元素的键值自动被排序(默认升序);map的所有元素都是pair,同时拥有键值和实值;
           map不允许两个元素有相同的键值;
    2)map允许通过迭代器修改元素值,但键值无法被修改(会影响元素的排列规则);
    3)由于map底层由RB-tree实现,迭代器相当于指向结点的指针,增删元素时内存并没有发生“改变”(元素移动),因此指向内存的指针不会失效。所以在客户对它进行增删操作前后,所有的迭代器都不会失效,被删除元素的迭代器除外;
    4)对于关联式容器应该使用其自身的find函数来搜寻元素,比STL算法find更有效率。
4.multiset允许元素的键值重复
5.multimap允许元素的键值重复
6.hashtable无自动排序功能
    1)SGI-STL的hashtable使用开链法来解决冲突,采用哈希桶结构来存储结点,由vector<node*>和list-node组成
    2)hashtable的迭代器类型为forwarditerator,没有后退操作;

    3)hashtable的迭代器必须永远维系着与整个“buckets vector”的关系,并记录目前所指的结点。(与deque类似)

    4)SGI-STL采用质数来设计表格大小(即vector大小),先将28个质数(大小逐渐呈现两倍的关系)存入一个数组;

  同时提供一个函数,用来查询在这28个质数之中,“最接近某数并大于某数”的质数。lower_bound()、upper_bound()
    5)bucket(list)的容量即buckets[i]的容量,就是buckets的大小(即vector的大小);当元素数量超过容量时,表格会重建
  重新申请一个vector,将原来的元素copy过来,然后释放原来的空间
    6)hashtable默认只能处理char,char*,const char*,int(unsinged int),short(unsinged short),long(unsinged long)类型
  数据,欲处理上述类型之外的类型需要用户自定义hash function.
7.hash_set
    hash_set底层由hashtable实现,除没有自动排序功能外,其余使用方法与set一致;
8.hash_map
    hash_map底层由hashtable实现,除没有自动排序功能外,其余使用方法与map一致;
9.hash_multiset
10.hash_multimap

11.hash_map与map的使用注意
    1)hash_map的底层是hashtable,理论上的平均操作复杂度是常数时间O(1);map的底层是RB-tree,理论上的操作平均复杂度是O(logN);
    2)选用hash_map还是map,关键在于关键字的查询次数,以及关注的是整体查询时间还是单词查询时间;
  若查询次数多,要求整体的查询效率,用hash_map;
  若查询次数少,由于hashtable会有不确定的O(N),会影响整体效率,因此选map;
原创粉丝点击