前言
对C/C++学习感兴趣的可以看看这篇文章哦:C/C++教程
一、STL概述
在软件行业,一直都希望建立一种可以重复运用的东西和一种可以制造出“可重复使用的东西”的方法,来让程序员的心血不至于随着时间迁移而烟消云散
子程序、程序、函数、类别、函数库、类别库、各种组件、结构化设计、模块化设计、面向对象设计、模式
以上所有无一不是软件工程为这一目标的的奋斗史,为的就是提升代码的复用性
而复用性必须要建立在某种标准之上
为了建立数据结构和算法的一套统一标准,并且降低其耦合,提升各自的独立性、弹性、交互性操作,C++社区诞生了STL。
STL的价值主要在两个方面:
- 就低层次而言,STL带给我们一套极具实用性的零部件,以及一个整合的组织
- 就高层次而言,STL还带给我们一个高层次、以泛型思维为基础的、系统的、条理分明的“软件组件分类学”
STL是一个抽象概念库,这些抽象概念包括:
- 可被复制
- 默认构造
- 可判断是否相等
- 可比较大小
- 具有输入功能的迭代器
- 具有输出功能的迭代器
- 单向/双向迭代器
- 随机存取迭代器
- 一元函数
- 二元函数
- ……
STL的创新在于具体的叙述了这些抽象概念,并加以系统化
即:STL实现的是以抽象概念为主体的结构,而不是我们常见的具体的class
进而形成了严谨的接口标准,在这样的接口下,任何组件都有最大的独立性,并用迭代器胶合起来、或用适配器互相配接、或以仿函数动态选择某种策略
C++的类允许我们自定义类别,其模板允许我们将类别参数化,这两者的结合通过traits
编程技法,成就了STL
二、STL历史
STL是由Alexander Stepanov创建于1979年前后,当时也是C++诞生的年代(1983年)
没想到吧,STL甚至比C++诞生的还早
在1993年,Alexander Stepanov带着它一手创建的STL,与C++标准委员会有了第一次接触
当时Alexander Stepanov给C++标准委员会作了一个演讲,讲题是:The Science of C++ Programming
从该讲题的名字也能看出,其理论性很强,但却很受欢迎
之后便顺利的提交了相关提案到委员会,最后也以80%的赞成,成功进入C++标准化的正式流程
其影响非常巨大,比如C++原本就有的stream,string等也都用模板重新写了一遍,至此,C++中几乎到处都是模板
三、STL六大组件功能与运用
STL共给我们提供了六大组件,彼此可以组合套用
- 容器:各种数据结构,比如常见的vector、list、set、map等等,用于存放数据
- 算法:各种常用的算法,比如sort、search、copy、erase,从实现角度来看,STL算法是一种函数模板
- 迭代器:其扮演着容器与算法之间的胶合剂,即“泛型指针”,共有5种类型,从实现角度看,迭代器是一种将各类指针相关的操作进行重载的类模板,所有容器都附带自己专属的迭代器
因为只有设计者才知道怎么遍历自己的元素
- 仿函数:行为类似函数,可作为算法的某种策略,从实现角度看,仿函数是一种重载了
()
的类或类模板 - 配接器:一种用于修饰容器或仿函数或迭代器接口的东西,比如STL中的queue与stark,虽然看似容器,其实是容器适配器,因为它们底层完全由deque来完成
- 配置器:负责控件配置和管理,从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的类模板
六大组件之间的关系为:容器通过配置器取得内存,算法通过迭代器存取容器中的内容,仿函数可以协助算法完成不同的策略变化,而适配器这可以修饰或套接仿函数
目前STL已经是C++标准程序库的一大组成部分,因此所有的C++编译器都一定持有一份STL源码,就在各个C++头文件中
STL并非以二进制程序出现,而是直接提供源代码
按C++标准,所有的标准头文件都不在有扩展名,比如C中常见的.h
,但或许是为了兼容,一些STL版本两种类型的头文件都存在
比如在VS中,就可以很方便的查看其源码:
不过没有一定的功力,其源码应该是很难看得懂的
但对于我们C/C++开发者而言,并没有太大的必要去弄懂STL源码
想要了解STL方方面面的内容如何使用,可以参照我的另一篇文章:STL详解