STL标准模板库
STL全称Standard Template Library,标准模板库。STL算法是泛型的(generic),不与任何特定数据结构和对象绑定,不必再环境类似的情况下重写代码。STL算法可以量身定做,并且具有很高的效率。STL可以进行扩充,我们可以编写自己的组件并且能够与STL标准的组件进行很好的配合。
STL标准库有六大组件:
- 空间配置器:allocator;
- 容器:string、vector、list、deque、map、set、multimap、multiset;
- 适配器:stack、queue、priority_queue;
- 仿函数:greater、less等;
- 算法:find、swap、reverse、sort、merge等;
- 迭代器:iterator、const_iterator、reverse_iterator、const_reverse_iterator;
空间配置器帮助我们管理分配内存的事情,从而来给容器分配内存;容器存储数据;迭代器帮助算法处理容器中的数据;仿函数辅助算法实现。
容器(container)
STL容器的作用用于存放数据,STL容器分为两大类:
- 序列式容器:其中的元素都是可排序的,STL提供了vector、list、deque等序列式容器,而stack、queue、priority_queue则是容器适配器;
- 关联式容器:每个数据元素都是由一个键(key)和值(value)组成,当元素被插入到容器时,按照其键以某种特定规则放入适当位置,key必须是唯一的;常见的STL关联容器有set、multiset、map、multimap;
序列型容器的基本使用
- vector:数组
- list:双向链表
- deque:双端队列
1 |
|
关联式容器的基本使用
1 | struct Display |
仿函数(functor)
仿函数一般不会单独使用,主要是为了搭配STL算法。STL主要是为了提高代码的复用性,早期C++为了提高复用性一般使用函数指针,但是函数指针不能满足STL对抽象性的要求,不能满足软件积木的要求,无法和其他STL组件搭配。仿函数的本质就是一个重载了operator()的类,创建一个行为类似函数的对象。
1 | // 不同方式实现对数组元素的排序 |
算法(algorithm)
STL中算法大致分为4类,包含
- 非可变序列算法:不直接修改其操作的容器内容的算法;
- 可变序列算法:可以修改它们操作容器内容的算法;
- 排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合算法;
- 数值算法:对容器内容进行数值计算;
最常见的算法包括查找、排序和通用算法,排列组合算法、数值算法、集合算法等。
1 |
|
迭代器
迭代器是一种智能指针,用于访问顺序容器和关联容器中的元素,相当于容器和操纵容器的算法之间的中介。迭代器可以分为四种:
- 正向迭代器:iterator
- 常量正向迭代器:const_iterator,常量指向的是元素,表示迭代器指向的元素不允许修改
- 反向迭代器:reverse_iterator
- 常量反向迭代器:const_reverse_iterator
容器 | 迭代器功能 |
---|---|
vector | 随机访问 |
deque | 随机访问 |
list | 双向访问 |
set | 双向访问 |
map | 双向访问 |
stack | 不支持迭代器 |
queue | 不支持迭代器 |
priority_queue | 不支持迭代器 |
1 |
|
容器适配器(adapter)
STL有三个容器适配器,注意不要和容器搞混:
- stack 堆栈:一种“先进后出”的容器适配器,底层数据结构使用的是deque;
- queue 队列:一种“先进先出”的容器适配器,底层数据结构使用的是deque;
- priority_queue 优先队列:一种特殊的队列,它能够在队列中进行排序(堆排序),底层实现结构是vector或者deque,不同编译器实现不同;
1 |
|
空间配置器(allocator)
从使用的角度看,空间配置器隐藏在STL组件当中,为容器默默的工作,不需要使用者关心,但是从理解STL实现的角度看,它是需要首先分析的组件。allocator的分析可以体现C++在性能和资源管理上的优化思想。allocator被叫做空间配置器而不是内存配置器,是因为它不仅仅可以在内存上分配空间,甚至可以直接在硬盘上分配一块空间。