NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
# 第1章 STL 概述与版本简介 ## 1.1 STL 概论 目的:复用性(reusablity)的提升。 STL 的价值在于两个方面: * 低层次:一套极具使用价值的零部件,以及一个整合的组织。 * 高层次:一个高层次、以泛型思维(Generic Paradigm)为基础的、系统化的、条理分明的“软件组件分类学components taxonomy)“。 **STL 历史**:STL 系由 Alexander Stepanov 创造于 1979 年前后,Alexander 在 AT&T 实验室以及惠普痛死的帕罗奥图(Hewlett-Packard Palo Alto)实验室,分别实验了多种架构和算法公式。 ## 1.2 STL 六大组件功能与应用 1. 容器(containers):各种数据结构,如vector、list、deque、set、map等,用来存放数据; 2. 算法(algorithms):各种常用算法,如sort、search、copy、erase; 3. 迭代器(iterators):扮演容器与算法之间的胶合剂,是所谓的泛型指针; 4. 仿函数(functors):行为类似函数,可作为算法的某种策略(policy); 5. 配接器(adapters):一种用来修改容器(containers)或仿函数(functors)或迭代器(iterators)接口的东西; 6. 配置器(allocators):负责空间配置与管理; ## 1.3 GNU 源代码开放精神 开发源代码的观念源自美国 Richard Stallman,他认为私藏源代码是一种违反人性的罪恶行为,而与他人分享源代码便可以让其它人从中学习,并回馈给原始创作者。 ## 1.4 HP 实现版本 HP 版本是所有 STL 实现版本的始祖。每一个 HP STL 头文件都有一份声明,允许任何人免费使用、拷贝、修改、传播、贩卖这份软件及其说明文件,唯一需要遵守的是,必须在所有文件中加上 HP 的版本声明和运用权限声明。 ## 1.5 P.J.Plauger 实现版本 P.J.Plauger 版本由 P.J.Plauger开发,PJ 版本继承 HP 版本。PJ 版本被 Visual C++ 采用。 ## 1.6 Rouge Wave 实现版本 Rouge Wave 版本由 Rouge Wave 公司开发, RW 版本继承 HP 版本。RW 版本被 C++ Builder 采用。 ## 1.7 STLport 实现版本 网络上有个 STLport 站点,提供一个以 SGI STL 为蓝本的高度可移植性实现版本。 ## 1.8 SGI STL 实现版本 SGI 版本由 Silicon Graphics Computer System, Inc. 公司发展,继承HP 版本,SGI 版本被 GCC 采用。 SGI STL 的头文件分为五组: * C++ 标准规范下的 C 头文件(无扩展名),如 cstdio、cstdlib、cstring; * C++ 标准程序库中不属于 STL 范畴者,如 stream,string; * STL 标准头文件(无扩展名),如 vector、deque、algorithm; * C++ Standard定案前,HP所规范的STL 头文件,如 vector.h、deque.h; * SGI STL 内部文件,如 stl\_vector.h、stl\_deque.h; 不同的编译器对 C++ 语言的支持程度不尽相同。作为一个希望具备广泛移植能的程序库,SGI STL 准备了一个环境组态文件 `stl_config.h`,其中定义了许多常量,标示某些组态的成立与否。所有STL头文件都会直接或间接包含这个组态文件,并以条件式写法,让预处理器(pre-processor)根据各个常量决定取舍哪一段程序代码。 ## 1.9 可能令你困惑的 C++ 语法 **临时变量**:一种无名对象(unnamed objects),它的出现如果不在程序员的预期之下,往往造成效率上的负担。刻意制造临时对象的方法是,在型别名称之后直接加一对小括号,并可指定初值,例如 Shape(3,5) 或 int(8),其意义相当于调用相应的 constructor 且不指定对象名称。 **静态常量整数成员在class内部直接初始化**:如果 class 内含 const static integral data member,那么根据 C++ 标准规格,可以在 class 之内直接给予初值。 **increament/dereference/decreament操作符**:increament/dereference 操作符在迭代器的实现上占有非常重要的地位,因为任何一个迭代器必须实现出前进(increment,operator++)和取值(dereference,operator*)功能,前者还分为前置式(prefix)和后置式(postfix)两种。有些迭代器具备双向移动功能,就需要再实现 decrement 操作,也分前置和后置。 **前闭后开区间**:任何一个STL算法,都需要获得由一对迭代器所标示的区间,用以标示操作范围,这一对迭代器所标示的是个所谓的前闭后开,以 `[first, last)` 表示。 **仿函数**:针对某个class进行operator() 重载,它就成为一个仿函数。