STL 的组成结构
通常认为,STL 是由容器、算法、迭代器、函数对象、适配器、内存分配器这 6 部分构成,其中后面 4 部分是为前 2 部分服务的,各自的含义如表 1 所示:
表 1:STL 组成结构
STL 的组成 |
含义 |
容器 |
一些封装数据结构的模板类,例如 vector 向量容器、list 列表容器等。 |
算法 |
STL 提供了大量(约 100 个)的数据结构算法,都是模板函数。这些算法位于std 命名空间中,多数位于头文件 <algorithm> 中,少数位于头文件 <numeric> 中。 |
迭代器 |
在 C++ STL 中,对容器中数据的读写通过迭代器完成,迭代器扮演容器和算法之间的“胶合剂”。 |
函数对象 |
如果一个类将 () 运算符重载为成员函数,这个类称为函数对象类,类的实例称为函数对象(又称仿函数)。 |
适配器 |
可以使一个类的接口(模板参数)适配成用户指定的形式,让本来无法协同工作的类得以协作。容器、迭代器和函数都提供适配器。 |
内存分配器 |
为容器类模板提供自定义的内存申请和释放功能。通常仅高级用户才需要定制,因此一般用户很少使用。 |
初学者简单了解上述内容即可,后续章节将对其进行系统的深入讲解。
STL 的头文件组织形式
惠普实验室最初发行的 STL 版本组织为 48 个头文件;但 C++ 标准对它们进行了重组,形成了现在的 13 个头文件,如表 2 所示:
表 2:C++ STL 标准头文件
序号 |
头文件名 |
1 |
<iterator> |
2 |
<functional> |
3 |
<vector> |
4 |
<deque> |
5 |
<list> |
6 |
<queue> |
7 |
<stack> |
8 |
<set> |
9 |
<map> |
10 |
<algorithm> |
11 |
<numeric> |
12 |
<memory> |
13 |
<utility> |
本节暂不过多赘述上述头文件的具体作用和用法,后续章节将进行详细介绍。
关于头文件扩展名的说明
根据 C++ 标准库的规定,所有标准头文件都应采用无扩展名的形式。例如:
- 标准规范:
<vector>
- 带扩展名(不推荐):
<vector.h>
或许是为了兼容旧代码,或许出于内部组织需要,不同的 STL 实现版本情况不同:
- Visual C++ 中的 Dinkumware 版本:同时具备
<vector.h> 和 <vector> 。
- SGI 版本:同时拥有
<vector> 、<vector.h> 和 <stl_vector.h> 三种形式。
- C++ Builder 的 RogueWave 版本:只有
<vector.h> 一种形式。
建议读者养成良好的编程习惯,严格遵守 C++ 标准规范,统一使用无扩展名的头文件。
|