在 C 语言中,很多东西都是由我们自己去实现的,例如自定义数组,线程文件操作,排序算法等等,有些复杂的东西实现不好很容易留下不易发现的 bug。而 C++为使用者提供了一套标准模板库 STL,其中封装了很多实用的容器,使用者使用容器的时候就不需要去注意代码的细节实现,使用容器也会更加安全和高效。
容器的实现就是靠模板类去实现的,例如 C++中的动态数组容器 vector,它其实就是一个类,类中维护了一块地址,然后类中的函数就可以定义为一些数组的行为,例如添加元素,删除元素等等,同时相比于 C 语言中的数组,使用容器因为是类在维护,所以,类中一般会进行安全性判断,对一些不安全的操作会进行规避,例如:C 语言中的数组 a 可以访问 a[-1],但是对于 C++中的容器 a,访问 a[-1]就会被拒绝.
C++的容器 分别为算法、容器、函数、 迭代器 。
STL 的优点
1.功能强大、代码精致。STL 由惠普实验室的无数大牛们开发,设计精巧,功能强大,集成了 优秀的算法。
2.高可重用性。 STL 广泛使用模板泛型编程,代码具有高度的复用性。
3.高性能、工业强度。 STL 提供的算法具有工业强度,高性能,用它可开发出性能高效的应用程序。
4.开源跨平台. STL 跨平台,而且开源,开发者可以很容易借鉴与扩展。
STL 的版本
1.HP STL
HP STL 是 Alexandar Stepanov 在惠普 Palo Alto 实验室工作时,与 Meng Lee 合作完成的。 HP STL 是 C++ STL 的第一个实现版本,而且是开放源码。其它版本的 C++ STL 一般是以 HP STL 为蓝本实现出来的。
2.SGI STL
由 Silicon Graphics Computer Systems 公司参照 HP STL 实现,主要设计者仍然是 STL 之父 Alexandar Stepanov,被 Linux 的 C++编译器 GCC 所采用。SGI STL 是开源软件,源码可读性甚高。
3.STLport
为了使 SGI STL 的基本代码都适用于 VC++和 C++ Builder 等多种编译器,俄国人 Boris Fomitchev 建立了一个 free 项目来开发 STLport,此版本 STL 是开放源码的。
4.P.J.Plauger STL
由 P.J.Plauger 参照 HP STL 实现出来,被 Visual C++编译器所采用,但不是开源的。
5.Rouge Wave STL
由 Rouge Wave 公司参照 HP STL 实现,用于 Borland C++编译器中,这个版本的 STL 也不 是开源的。
STL 的六大组件
1、容器(Containers):各种数据结构,如 Vector,List,Deque,Set,Map,用来存放数据,STL 容 器是一种 Class Template,就体积而言,这一部分很像冰山载海面的比率。
2、算法(Algorithms):各种常用算法如 Sort,Search,Copy,Erase,从实现的角度来看,STL 算法是一种 Function Templates。
3、迭代器(Iterators):扮演容器与算法之间的胶合剂,是所谓的“泛型指针”,共有五种类 型,以及其它衍生变化,从实现的角度来看,迭代器是一种将:Operators*,Operator->,Operator++,Operator–等相关操作予以重载的 Class Template。所有STL 容器都附带有自己专属的迭代器,只有容器设计者才知道如何遍历自己的元素,原生指针(Native pointer)也是一种迭代器。
4、仿函数(Functors): 行为类似函数,可作为算法的某种策略(Policy),从实现的角度来看,仿函数是一种重载了 Operator()的 Class 或 Class Template。一般函数指针可视为狭义的
仿函数。
5、配接器(适配器)(Adapters):一种用来修饰容器(Containers)或仿函数(Functors) 或迭代器(Iterators)接口的东西,例如:STL 提供的 Queue 和 Stack,虽然看似容器,其实只能算是一种容器配接器,因为 它们的底部完全借助 Deque,所有操作有底层的 Deque 供应。 改变 Functor 接口者,称为 Function Adapter;改变 Container 接口者,称为 Container Adapter; 改变 Iterator 接口者,称为 Iterator Adapter。配接器的实现技术很难一言蔽之,必须逐一分析。
6、分配器(Allocators):负责空间配置与管理,从实现的角度来看,配置器是一个实现了动态空间配置、空间管理、空间释放的 Class Template。