大部分人提到 C++ 标准库的时候首先想到的就是STL
,STL
的全称是Standard Template Library
,它背后的技术支撑是模板,由于很多人对于模板本身的不了解,导致很多人对于 STL
的理解也非常的片面。有些人把STL
等同于容器,有些人把STL
等同于标准库。
C++支持非常多的编程范式【1】,C++标准库中用到的基本上是基于对象和泛型这两种(没错,标准库中面向对象其实非常少,没记错的话,只在异常体系中出现过),很明显STL
不等同于C++标准库。那是不是说标准库中的泛型部分就属于STL
呢?答案也是否定的。C++标准库中的大部分类都是泛型类,但是不是所有的泛型类都是STL
,比如
std::string
就属于泛型类,但是它不属于STL
。
STL 的组成
很多人提到STL
首先想到的是容器,容器属于STL
中非常重要的部分,但是绝对不是唯一的部分,实际上STL
由 6 部分组成【2】:
- 容器(container)
- 算法(algorithm)
- 迭代器(iterator)
- 仿函数(functor)
- 适配器(adaptor)
- 配置器(allocator)
这六个部分的关系《STL源码剖析》一书中给了:
这个系列的文章中会介绍Allocator以外的所有组件【3】
反OO的另外一种思维模式
有很大一部分人谈论到C++的时候都是在谈论它用于OO编程(也有人只谈论数据抽象这个维度,或者面向过程这个维度),但是C++编程利器STL实际上是一种反OO的实现逻辑。比如说学OO的人大多习惯的一个概念是数据和操作数据的方法封装成一个类。STL的逻辑却可以说是数据和操作数据的方法分离,数据部分放到容器中,数据操作部分放到算法中,这中间使用迭代器连接在一起。
【1】: 在C++之父的《C++编程语言》一书中提到下面几种:
- 过程式编程(Procedural programming),C 中继承过来的模式
- 数据抽象(Data abstration),基于类的数据和操作的封装
- 面向对象编程(Object-oriented programming),基于虚函数的多态
- 泛型编程(Generic programming),基于模板
【2】:关于 STL 的组成,请参考《STL源码剖析》和《泛型编程与STL》两本书。其中《泛型编程与STL》这本书对于泛型编程的许多概念,解释的非常清楚,非常值得一读。
【3】:不介绍Alloctor主要是两个原因,第一:绝大部分时间,你不需要用到它;第二:《STL源码剖析》一书中讲的比较清楚,有需要的可以查看这本书。