STL简介:
STL(Standard Template Library),即标准模板库,是c++的标准程序库。里面包含了各种数据结构的具体实现,具有很高的可复用性。对程序而言,熟练掌握这些用法写代码将会事半功倍。
STL六大组件:
1. 容器(Container)
各种数据结构,例如: vector、list、deque、set、map等。STL容器实际就是一个class template(模板)。
2. 算法
实现各种常用算法,例如sort、search、copy、earse等。STL算法实际就是一个founction template(模板)。
3. 迭代器(Iterator)
提供了访问容器中对象的方法。每个容器都有自己的迭代器。
4. 仿函数(Function object)
行为类似函数,可作为算法的某种策略。
5. 迭代适配器(Adaptor)
用来修饰容器或迭代器或仿函数接口的东西。
6. 空间配制器(allocator)
负责空间配置与管理。
ps: 我们常用的就是容器、算法和迭代器。后面我会逐一学习这几个,并不定期更新学习结果。
STL容器的分类:
STL容器分为序列式容器和关联式容器。
序列式容器: 其中的元素有可序,但未必有序。
关联式容器: 关联式容器中每笔数据都有key和value,当元素被插入容器中时,容器内部结构便依照其值大小,以某种特定规则将元素插入到容器中。关联式容器没有头尾(只有最大和最小元素),所以没有push_back、push_frount、pop_back、pop_front、end()、begin()等函数。
STL容器底层数据结构实现
C++ STL 的实现:
1.vector 底层数据结构为数组 ,支持快速随机访问
2.list 底层数据结构为双向链表,支持快速增删
3.deque 底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问
deque是一个双端队列(double-ended queue),也是在堆中保存内容的.它的保存形式如下:
[堆1] --> [堆2] -->[堆3] --> ...
每个堆保存好几个元素,然后堆和堆之间有指针指向,看起来像是list和vector的结合品.
4.stack 底层一般用list或deque实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时
5.queue 底层一般用list或deque实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时
(stack和queue其实是适配器,而不叫容器,因为是对容器的再封装)
6.priority_queue 底层数据结构一般为vector为底层容器,堆heap为处理规则来管理底层容器实现
7.set 底层数据结构为红黑树,有序,不重复
8.multiset 底层数据结构为红黑树,有序,可重复
9.map 底层数据结构为红黑树,有序,不重复
10.multimap 底层数据结构为红黑树,有序,可重复
11.hash_set 底层数据结构为hash表,无序,不重复
12.hash_multiset 底层数据结构为hash表,无序,可重复
13.hash_map 底层数据结构为hash表,无序,不重复
14.hash_multimap 底层数据结构为hash表,无序,可重复
15. hash_table