STL:泛型程序设计(程序的通用性)
1、STL定义
STL(标准模板库)惠普实验室开发的一系列软件的统称。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,被内建在你的编译系统之内。
2、STL头文件
在C++标准中,STL被组织为下面的17个头文件:<algorithm>、<deque>、<functional>、<iterator>、<array>、<vector>、<list>、<forward_list>、<map>、<unordered_map>、<memory>、<numeric>、<queue>、<set>、<unordered_set>、<stack>、<utility>。
3、组成部分:
STL可分为容器、迭代器、空间配置器、配接器、算法、仿函数六个部分。
容器部分主要由头文件<vector>、<list>、<deque>、<set>、<map>、<stack>以及<queue>组成。
序列式容器
向量(vector)连续存储的元素<vector>
列表(list)由节点组成的双向链表,每个结点包含着一个元素<list>
双端队列(deque)连续存储的指向不同元素的指针所组成的数组<deque>
容器适配器
栈(stack)后进先出的值的排列 <stack>
队列(queue)先进先出的值的排列 <queue>
优先队列(priority_queue)元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列 <queue>
关联式容器
集合(set)由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能 够拥有相同的次序 <set>
多重集合(multiset)允许存在两个次序相等的元素的集合 <set>
映射(map)由{键,值}对组成的集合,以某种作用于键对上的谓词排列 <map>
多重映射(multimap)允许键对有相等的次序的映射 <map>
Stl =抽象出(算法+数据结构)以实现通用,是一套可拓展的框架
Stl中的六大组件:
1. 容器(数据结构)
2. 算法
3. 迭代器
4. 函数对象(仿函数)(用于扩展)
5. 分配器(用于扩展)
6. 适配器
1. 容器:
序列式容器:
Vector(可变长数组)
数组有序,支持随机访问时间复杂度O1 一步到位
Vector实际不可变长,当预先分配的空间不足时,会再分配更大的空间,然后把原有的值复制进去。(一维数组)
List(列表)
大部分为双向列表,随机访问速度On,插入删除速度O1
设计形式可能不同
Deque(双端队列)
包含有一个Map中控器,每一个map中的键值对,值都指向一块连续的空间。
(涉及2级指针)两端插入速度O1,随机访问速度O2+
关联式容器(通过红黑二叉树实现):
(红黑树:通过旋转,实现自动左右平衡)运用二分法,便于随机查找
随机访问的次一级选择
Set(通过序列号,随机访问元素)
Map(通过key,随机访问value)
Multiset(序号能重复)
Multimap(key能重复)
容器中的数据经过红黑树的重新排序。
2. 适配器(改变对应接口的组件):
适配器,在STL中扮演着转换器的角色,本质上是一种设计模式,用于一种接口转换成另一种接口,从而使原本不兼容的接口能够很好地一起运作。
即添加或屏蔽原有组件中的一些功能。
改变容器的接口,称为容器适配器
栈 stark
队列queue
优先队列
改变迭代器的接口,称为迭代器适配器
反向迭代器
插入迭代器
IO迭代器
改变仿函数的接口,称为仿函数适配器
函数对象适配器
成员函数迭代器
普通函数迭代器
3. 算法(algorithm):
在算法头文件中,可以作用于任何一个容器中
4. 迭代器
用于连接容器与算法,是一个统一的接口。
5. 函数对象
6. 分配器