STL源码分析学习笔记 之 第一章_STL简介和版本

第一章 STL概论与版本简介

1.1 STL概论

为了复用性的提升,为了建立数据结构和算法的一套标准,并且降低其间的耦合(coupling)关系以提升各自的独立性、弹性、交互操作性(interoperability),C++社群里面诞生了STL。
STL的价值

  • 低层次
    • 一套极具实用价值的零部件
    • 一个整合的组织
  • 高层次
    • 以泛型思维(Generic Paradigm)为基础、系统化的、条理分明的“软件组件分类学(componens taxonomy)”
    • 具体叙述了抽象概念并加以系统化

1.1.1 STL的历史

STL由Alexander Stepanov创造于1979年前后,这也正是Bjarne Stroustrup创造C++的年代。第一个支持泛型概念的语言是Ada。当时C++尚未导入template性质,但C++允许程序员通过指针以极佳弹性处理内存,这一点正是既要求一般化(泛型)又不失效能的一个重要关键。
Alexander在AT&T实验室以及惠普公司的帕罗奥图实验室,分别实验了多种架构和算法公式,先以C完成,而后再以C++完成。1992年Meng Lee加入Alex的项目,成为STL的另一位主要贡献者。
贝尔(Bell)实验室的Andrew Koening于1993年知道这个研究计划后,邀请Alexander于11月ANSI/ISO C++标准委员会会议上展现其观念。并于次年夏天的Waterloo(滑铁卢)会议开幕前,完成正式提案,并以压倒性多数一举让这个巨大的计划成为C++标准规格的一部分。

1.1.2 STL与C++标准程序库

1993年9月,Alexander Stepanov和他一手创建的STL,与C++标准委员会有了第一次接触。
1994年1月6日Alexander收到Andy Koening(C++标准委员会成员,当时的C++ Standard文件审核编辑)来信,言明如果希望STL成为C++标准程序库的一部分,可于1994年1月25日之前送交一份提案报告到委员会。
1994年3月圣地亚哥会议。STL在会议上取得很好的回响,但也有反对意见。主要反对意见是C++即将完成最终草案,而STL却是如此庞大,似乎有点时不我予。
然后就是Waterloo会议,80%赞成20%反对,终于进入C++标准化的正式流程,并成为1998年9月定案的C++标准规格中的一大派系。原有的C++程序库,如stream,string等也都以template重新写过。


1.2 STL六大组件 功能与运用

STL提供六大组件,彼此可以组合套用:

  1. 容器(containers):各种数据结构,如vector,list,deque,set,map,用来存放数据。从实现的角度来 看,STL容器是一种class template。就体积而言,这一部分很像冰山在海面下的比率。
  2. 算法(algorithms):个中国常用算法如sort,search,copy,erase……。从实现角度来看,STL算法是一种 function template。
  3. 迭代器(iterators):扮演容器与算法之间的胶合剂,是所谓的“泛型指针”。共有五种类型,以及其他衍生 变化。从实现角度看,迭代器是一种将operator*,operator->,operator++,operater–等指针相关操作予 以重载的class template。所有STL容器都附带有自己专属的迭代器。原生指针也是一种迭代器。
  4. 仿函数(functors):行为类似函数,可作为算法的某种策略(policy)。从实现的角度来看,仿函数是一种重载了operator()的class或class template,一般函数指针可视为狭义的仿函数。
  5. 配接器(adapters): 一种用来修饰容器(containers)或仿函数(functors)或迭代器(iterators)接口的东西。例如STL提供的queue和stack,虽然看似容器,其实只能算是一种容器配接器,因为它们的底部完全借助deque,所有操作都由底层的deque供应。
  6. 配置器(allocators):负责空间配置与管理。从实现的角度来看,配置器是一个实现了动态空间配置、空间管理、空间释放的class template。

由于STL已经成为C++标准程序库的大脉系,目前所有C++编译器一定支持有一份STL,在C++头文件(headers)中,按照C++ Standard 的规定,所有标准文件都不再有扩展名,某些STL版本同时存在具有扩展名和无扩展名的两份文件。某些只存在具扩展名的头文件。某些STL版本不仅有一线装配,还有二线装配,例如GNU C++SGI版本不但有一线的<vector.h>和,还有二线的<stl_vector.h>


1.3 GNU源代码的开放精神

全世界所有的STL实现版本,都源于Alexander Stepanov 和 Meng Lee完成的原始版本,这份原始版本由Hewlett-Packard Company(惠普公司)拥有。每一个头文件都有一份声明,允许任何人任意运用、拷贝、修改、传播、贩卖这些代码,无需付费,唯一的条件是必须将该份声明置于使用者新开发的文件内。
开源精神(open source)源于美国人Richard Stallman(理查德·史托曼)。他于1984年离开麻省理工学院,创立自由软件基金会(Free Software Foundation,简称FSF),写下著名的GNU宣言(GNU Manifesto)。
GNU这个名称代表GNU is Not Unix。
GNU计划中,早期最著名的软件包括Emacs和GCC,前者是Stallman开发的一个非常灵活的文本编译器,后者是一个C/C++编译器。GNU计划晚近的著名软件则是1991年由芬兰人Linus Torvalds开发的Linux操作系统。
GNU以所谓的GPL(General Public License,广泛开放授权)来保护其成员,甚至被称为反版权(copyleft)。
自1999年起,EGCS(Experimental/Enhanced GNU Compiler System)正式成为唯一的GCC官方维护机构。


1.4 HP实现版本

属于open source,但不属于GNU GPL范畴。


1.5 P.J.Plauger实现版本

P.J.Plauger版本由P.J.Plauger开发,继承自HP版本,除了HP版本声明还加上了P.J.Plauger的个人版权声明。这个版本不属于open source范畴,更不是GNU GPL。
P.J.Plauger版本被Virtual C+采用,可以在“include”子目录下找到所有的STL头文件,但是不能公开它或修改它或甚至贩卖它。


1.6 Rouge Wave实现版本

被C++ Builder采用,不属于open source范畴。


1.7 STLport实现版本


1.8 SGI STL实现版本

SGI版本被GCC采用,可以在GCC的“include”子目录下找到所有STL头文件。

1.8.1 GNU C++ headers文件分布

共128个文件

1.8.2 SGI STL文件分布与简介

  • C++标准规范下的C头文件(无扩展名),例如 cstdio,cstdlib,cstring
  • C++标准程序库中不属于STL范畴者,例如Stream,string……相关文件。
  • STL标准头文件(无扩展名),例如 vector,deque,list,map,algorithm,functional……
  • C++ Standard定案前,HP所规范的STL头文件,例如 vector.h,deque.h,list.h,map.h,algo.h,functon.h……
  • SGI STL 内部文件(STL真正实现于此),例如stl_vector.h,stl_deque.h,stl_list.h,stl_map.h,stl_algo.h,stl_function.h……
    其中后三组头文件详细列表于下

(1) STL标准头文件(无扩展名)

文件名(按字母排序) 本书章节 说明
algorithm ref.<stl_algorithm.h>
deque ref.<stl_deque.h>
functional ref.<stl_function.h>
hash_map ref.<stl_hash_map.h>
hash_set ref.<stl_hash_set.h>
iterator ref.<stl_iterator.h>
list ref.<stl_list.h>
map ref.<stl_nap.h>
memory 3.2 定义auto_ptr,幷包含
<stl_algobase.h>,
<stl_alloc.h>,
<stl_construct.h>,
<stl_tempbuf.h>,
<stl_uninitialized.h>,
<stl_raw_storage_iter.h>
numeric ref.<stl_numeric.h>
pthread_alloc N/A 与pthread相关node allocator
queue ref.<stl_queue.h>
rope ref.<stl_rope.h>
set ref.<stlset.h>
slist ref.<stl_slist.h>
stack ref.<stl_stack.h>
utility 包含<stl_relops.h>,<stl_pair.h>
vector ref.<stl_vector.h>

(2) C++ Standard定案前,HP规范的STL文件名(扩展名.h)

文件名(按字母排序) 本书章节 说明
complex.h N/A 复数,包含<complex>
包含STL标准头文件
<algorithm>,<br><deque>,<functional>,
<iterator>,<list>,<map>,
<memory>,<numeric>,<set>,
<stack>,<utility>,<vectory>
type_traits.h 3.7 SGI 独特的type-traits技法
algo.h ref.<stl_algo.h>
algobase.h ref.<stl_algobase.h>
alloc.h ref.<stl_alloc.h>
bvector.h ref.<stl_bvector.h>
defalloc 2.2.1 标准空间配置器std::allocator,
不建议使用
deque.h ref.<stl_deque.h>
function.h ref.<stl_function.h>
hash_map.h ref.<stl_hash_map.h>
hash_set.h ref.<stl_hash_set.h>
hashtable.h ref.<stl_hashtable.h>
heap.h ref.<stl_heap.h>
iterator.h ref.<stl_iterator.h>
list.h ref<stl_list.h>
map.h ref.<stl_map.h>
multimap.h ref.<stl_multimap.h>
multiset.h ref.<stl_multiset.h>
pair.h ref.<stl_pair.h>
pthread_alloc.h N/A #include <pthread_alloc>
rope.h ref.<stl_rope.h>
set.h ref.<stl_set.h>
slist.h ref.<stl_set.h>
stack.h ref.<stl_stack.h>
tempbuf.h ref.<stl_tempbuf.h>
tree.h ref.<stl_tree.h>
vector.h ref.<stl_vector.h>

(3) SGI STL 内部私用文件(SGI STL真正实现于此)

文件名(按字母排序) 本书章节 说明
stl_algo.h 6 算法(数值类除外)
stl_algobase.h 6.4 基本算法swap,min,max,copy,
copy_backword,copy_n,fill,
fill_n,mismath,equal,
lexicograph,cal_compare
stl_alloc.h 2 空间配置器std::alloc
stl_bvector.h N/A bit_vector(类似标准的bitset)
stl_config.h 1.9.1 针对各家编译器特性定义各种环节变量
stl_construct.h 2.2.3 构造/析构基本工具
(construct(),destroy())
stl_deque.h 4.4 deque(双向开口的queue)
stl_function.h 7 函数对象(function object)
或称仿函数(functor)
stl_hash_fun.h 5.6.7 hash function
stl_hash_map.h 5.8 以hast-table完成之map,multimap
stl_hash_set.h 5.7 以hast-table完成之set,multiset
stl_hashtable.h 5.6 hast-table(杂凑表)
stl_iterator.h 3.8.4 8.5 迭代器及其相关配接器,并定义迭代器
常用函数advance(),distance()
stl_list.h 4.3 list(串行,双向)
stl_map.h 5.3 map(映象表)
stl_multimap.h 5.5 multi-map(多键映象表)
stl_multiset.h 5.4 multi-set(多键集合)
stl_numeric.h 6.3 数值类算法:accumulate,
inner_product,partial_sum,
adjacent_difference,power,
iota
stl_pair.h 5.4 pair(成对组合)
stl_queue.h 4.6 queue(队列)
stl_raw_storage_iter.h N/A 定义raw_storage_iterator
(一种 OutputIterator)
stl_rope.h N/A 大型(巨量规模)的字符串
stl_set.h 5.2 set(集合)
stl_slist.h 4.9 single list(单向串行)
stl_stack.h 4.5 stack(堆栈)
stl_tempbuf.h N/A 定义temporary_buffer class,
应用于<stl_algo.h>
stl_tree.h 5.1 Red Black tree(红黑树)
stl_uninitialized.h 2.3 内存管理基本工具:
uninitialized_copy,
uninitialized_fill,
uninitialized_fill_n.
stl_vector.h 4.2 vector(向量)

1.8.3 SGI STL的编译器组态设置(configuration)

不同的编译器对C++语言的支持程度不同,准备了一个环境组态文件<stl_config.h>,其中定义了许多常量来标示某些组态成立与否。所有STL头文件都会包含这个组态文件,并以条件写法让预编译器根据常量取舍哪一段程序代码。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章