C++轮子 —— STL 简介

大部分人提到 C++ 标准库的时候首先想到的就是STLSTL的全称是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源码剖析》一书中讲的比较清楚,有需要的可以查看这本书。