码迷,mamicode.com
首页 > 其他好文 > 详细

STL总结

时间:2016-08-14 17:55:26      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

1.

容器如vector、deque、list是线性存储的,它们都是有迭代器的。

queue和stack作为容器适配器,没有迭代器的。它们默认使用deque作为底层元素。

2.

heap不属于STL容器,但是它是优先队列的幕后英雄。heap底层是vector或者array实现的。STL实现了最大堆,这样可以满足优先队列的特性。

优先队列也是容器适配器。

3.

slist是单向列表,它的迭代器也是单向的。(这和list的双向迭代器明显不同)slist每次遍历只能从头开始,在插入元素的时候不提供push_back(),只提供push_front(),这样元素的次序会和插入的次序相反。

4.红黑树

红黑树的插入操作主要包括:insert_unique()和insert_equal()。

5.

map是键值对,不允许有重复的键值。会按照元素的键值自动升序。map底层容器也是RB-tree实现的,所以其插入删除操作不会引起迭代器失效。

multimap不支持下标运算,而map支持。当删除一个元素时,使用key值做参数会删除相关key值的所有记录并返回行数。

使用find和count可以分别返回某一键值的第一个位置和个数。


m.lower_bound(k)   返回一个迭代器,指向键不小于k的第一个元素。


m.upper_bound(k)   返回一个迭代器,指向键大于k的第一个元素。


m.equal_range(k)   它的first成员等价于m.lower_bound(k),second成员等价于m.upper_bound(k)。


可用通过调用equal_range函数来取代调用upper_bound和lower_bound函数。equal_range函数返回存储一对迭代器的pair对象。如果该值存在,则pair对象中的第一个迭代器指向该键关联的第一个实例,第二个迭代器指向该键关联的最后一个实例的下一位置。如果找不到匹配的元素,则pair对象中的两个迭代器都将指向此键应该插入的位置。

<span style="font-size:18px;">pair<authors_it,authors_it> pos  
    = authors.equal_range(searchVal);  
  
while (pos.first != pos.second)  
{  
    cout << pos.first -> second << endl;  
    ++ pos.first;  
}  </span>

set是集合,不允许有重复的值。底层实现是RB-tree。想要判断一个值是否存在,使用set最为合适。


6.hashtable

hashtable无法处理未定义类型的元素,除非用户自己定义hash函数。

hash_set是以hashtable为底层实现的,set能实现自动排序,而hash_set不会。

hash_map、hash_multiset、hash_multimap


STL的所有关联容器都拥有自动排序功能(以为底层的RB-tree是自动排序的)因此,不需要使用sort算法。

顺序容器中stack、queue、priority-queue都有特定的入口和出口,不允许用户对元素排序。剩下的vector、deque、list,其中vector、deque适合使用sort算法,因为其迭代器属于RandomAccessIterators。而list迭代器是Bidirectionalterators,slist属于ForwardIterators,都不适合sort算法;list、slist排序,应该使用它们自己提供的成员函数sort()。


 SGI STL sort算法的思想:数据量大采用快速排序,分段排序;一旦分段后的数量小于某个门槛,为了避免快速排序的递归调用带来过大的额外负荷,改用插入排序;如果递归层次过深,还会改用堆排序。



STL总结

标签:

原文地址:http://blog.csdn.net/yutianxin123/article/details/52204681

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!