STL总结

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值