STL 源码剖析
基本信息
编辑推荐
学习编程的人都知道,阅读、剖析名家代码乃是提高水平的捷径。源码之前,了无秘密。大师们的缜密思维、经验结晶、技术思路、独到风格,都原原本本体现在源码之中。在你仔细推敲之中,迷惑不解之时,恍然大悟之际,你的经验、思维、视野、知识乃至技术品位都会获得快速的成长。
推荐阅读
内容简介回到顶部↑
这本书不适合C++ 初学者,不适合 Genericity(泛型技术)初学者,或 STL 初学者。这本书也不适合带领你学习面向对象(Object Oriented)技术 — 是的,STL 与面向对象没有太多关连。本书前言清楚说明了书籍的定位和合适的读者,以及各类基础读物。如果你的Generic Programming/STL实力足以阅读本书所呈现的源码,那么,恭喜,你踏上了基度山岛,这儿有一座大宝库等着你。源码之前了无秘密,你将看到vector的实现、list的实现、heap的实现、deque的实现、RB-tree的实现、hash-table的实现、set/map 的实现;你将看到各种算法(排序、搜寻、排列组合、数据移动与复制…)的实现;你甚至将看到底层的memory pool 和高阶抽象的traits 机制的实现。那些数据结构、那些算法、那些重要观念、那些编程实务中最重要最根本的珍宝,那些蜇伏已久彷佛已经还给老师的记忆,将重新在你的脑中闪闪发光。
作译者回到顶部↑
目录回到顶部↑
庖丁解牛(侯捷自序) i
目录 v
前言 xvii
本书定位 xvii
合适的读者 xviii
最佳阅读方式 xviii
我所选择的剖析对象 xix
各章主题 xx
编译工具 xx
中英术语的运用风格 xxi
英文术语采用原则 xxii
版面字形风格 xxiii
源码形式与下载 xxiv
在线服务 xxvi
推荐读物 xxvi
第1章 stl 概论与版本简介001
1.1 stl 概论 001
1.1.1 stl的历史 003
1.1.2 stl与c++ 标准程序库 003
目录 v
前言 xvii
本书定位 xvii
合适的读者 xviii
最佳阅读方式 xviii
我所选择的剖析对象 xix
各章主题 xx
编译工具 xx
中英术语的运用风格 xxi
英文术语采用原则 xxii
版面字形风格 xxiii
源码形式与下载 xxiv
在线服务 xxvi
推荐读物 xxvi
第1章 stl 概论与版本简介001
1.1 stl 概论 001
1.1.1 stl的历史 003
1.1.2 stl与c++ 标准程序库 003
前言回到顶部↑
本书定位
C++ 标准程序库是个伟大的作品。它的出现,相当程度地改变了C++ 程序的风貌以及学习模式[1]。纳入STL(Standard Template Library)的同时,标准程序库的所有组件,包括大家早已熟悉的 string、stream 等等,亦全部以template 覆盖过。整个标准程序库没有太多的OO(Object Oriented),倒是无处不存在GP(Generic Programming)。
C++ 标准程序库中隶属STL 范围者,粗估当在80% 以上。对软件开发而言,STL 是尖甲利兵,可以节省你许多时间。对编程技术而言,STL 是金柜石室 — 所有与编程工作最有直接密切关联的一些最被广泛运用的数据结构和算法,STL 都有实现,并符合最佳(或极佳)效率。不仅如此,STL 的设计思维,把我们提升到另一个思想高点,在那里,对象的耦合性(coupling)极低,复用性(reusability)极高,各种组件可以独立设计又可以灵活无罅地结合在一起。是的,STL不仅仅是程序库,它其实具备 framework格局,允许使用者加上自己的组件,与之融合并用,是一个符合开放性封闭(Open-Closed)原则的程序库。
从应用角度来说,任何一位C++ 程序员都不应该舍弃现成、设计良好而又效率极佳的标准程序库,却 “入太庙每事问”地事事物物从轮子造起 — 那对组件技术及软件工程是一大嘲讽。然而对于一个想要深度钻研STL以便拥有扩充能力的人,相当程度地追踪STL源代码是必要的功课。是的,对于一个想要充实数据结构与算法等固有知识,并提升泛型编程技法的人,“入太庙每事问”是必要的态度,追踪STL源代码则是提升功力的极佳路线。
想要良好运用STL,我建议你看《The C++ Standard Library》by Nicolai M. Josuttis;想要严谨认识STL 的整体架构和设计思维,以及STL的详细规格,我建议你看 《Generic Programming and the STL》by Matthew H. Austern;想要从语法层面开始,学理与应用得兼,宏观与微观齐备,我建议你看《泛型思维》by侯捷;想要深入STL实现技法,一窥大家风范,提升自己的编程功力,我建议你看你手上这本《STL 源代码剖析》— 事实上就在下笔此刻,你也找不到任何一本相同定位的书[2]。
合适的读者
本书不适合STL 初学者(当然更不适合C++ 初学者)。本书不是面向对象(Object Oriented)相关书籍。本书不适合用来学习 STL的各种应用。
对于那些希望深刻了解STL 实现细节,俾得以提升对STL的扩充能力,或是希望藉由观察STL源代码,学习世界一流程式员身手,并藉此彻底了解各种被广泛运用之数据结构和算法的人,本书最适合你。
最佳阅读方式
无论你对STL认识了多少,我都建议你第一次阅读本书时,采循序渐进方式,遵循书中安排的章节先行浏览一遍。视个人功力的深浅,你可以或快或慢并依个人兴趣或需要,深入其中。初次阅读最好循序渐进,理由是,举个例子,所有容器(containers)的定义式一开头都会出现空间配置器(allocator)的运用,我可以在最初数次提醒你空间配置器于第2章介绍过,但我无法遍及全书一再一再提醒你。又例如,源代码之中时而会出现一些全局函数调用动作,尤其是定义于 [stl_construct.h] 之中用于对象建构与解构的基本函数,以及定义于 [stl_uninitialized.h] 之中用于内存管理的基本函数,以及定义于 [stl_algobase.h] 之中的各种基本算法。如果那些全局函数已经在先前章节介绍过,我很难保证每次都提醒你 — 那是一种顾此失彼、苦不堪言的劳役,并且容易造成阅读上的累赘。
我所选择的剖析对象
本书名为《STL源代码剖析》,然而STL 实作品百花齐放,不论就技术面或可读性,皆有高下之分。选择一份好的实现版本,就学习而言当然是极为重要的。我选择的剖析对象是声名最盛,也是我个人评价最高的一个产品:SGI(Silicon Graphics Computer Systems, Inc.)版本。这份由 STL 之父Alexander Stepanov、经典书籍《Generic Programming and the STL》作者 Matthew H. Austern、STL 巨匠David Musser 等人投注心力的STL实现版本,不论在技术层次、源代码组织、源代码可读性上,均有卓越的表现。这份产品被纳为GNU C++ 标准程序库,任何人皆可从网际网络上下载GNU C++ 编译器,从而获得整份STL源代码,并获得自由运用的权力(详见1.8节)。
我所选用的是cygnus[3] C++ 2.91.57 for Windows版本。我并未刻意追求最新版本,一来书籍不可能永远呈现最新的软件版本 — 软件更新永远比书籍改版快速,二来本书的根本目的在建立读者对于STL巨观架构和微观技术的掌握,以及源代码的阅读能力,这种核心知识的形成与源代码版本的关系不是那么唇齿相依,三来SGI STL 实作品自从搭配GNU C++2.8 以来已经十分稳固,变异极微,而我所选择的2.91版本,表现相当良好;四来这个版本的源代码比后来的版本更容易阅读,因为许多内部变量名称并不采用下划线(underscore) — 下划线在变量命名规范上有其价值,但到处都是下划线则对大量阅读相当不利。
网络上有个STLport(http://www.stlport.org)站点,提供一份以SGI STL 为蓝本的高度可移植性实现版本。本书附录C列有孟岩先生所写的文章,是一份STLport移植到Visual C++ 和C++ Builder 的经验谈。
各章主题
本书假设你对STL已有基本认识和某种程度的运用经验。因此除了第一章略作介绍之外,立刻深入STL技术核心,并以STL 六大组件(components)为章节之进行依据。以下是各章名称,这样的次序安排大抵可使每一章所剖析的主题能够于先前章节中获得充份的基础。当然,技术之间的关连错综复杂,不可能存在单纯的线性关系,这样的安排也只能说是尽最大努力。
第1章 STL 概论与实现版本简介
第2章 空间配置器(allocator)
第3章 迭代器(iterators)概念与 traits 编程技法
第4章 序列式容器(sequence containers)
C++ 标准程序库是个伟大的作品。它的出现,相当程度地改变了C++ 程序的风貌以及学习模式[1]。纳入STL(Standard Template Library)的同时,标准程序库的所有组件,包括大家早已熟悉的 string、stream 等等,亦全部以template 覆盖过。整个标准程序库没有太多的OO(Object Oriented),倒是无处不存在GP(Generic Programming)。
C++ 标准程序库中隶属STL 范围者,粗估当在80% 以上。对软件开发而言,STL 是尖甲利兵,可以节省你许多时间。对编程技术而言,STL 是金柜石室 — 所有与编程工作最有直接密切关联的一些最被广泛运用的数据结构和算法,STL 都有实现,并符合最佳(或极佳)效率。不仅如此,STL 的设计思维,把我们提升到另一个思想高点,在那里,对象的耦合性(coupling)极低,复用性(reusability)极高,各种组件可以独立设计又可以灵活无罅地结合在一起。是的,STL不仅仅是程序库,它其实具备 framework格局,允许使用者加上自己的组件,与之融合并用,是一个符合开放性封闭(Open-Closed)原则的程序库。
从应用角度来说,任何一位C++ 程序员都不应该舍弃现成、设计良好而又效率极佳的标准程序库,却 “入太庙每事问”地事事物物从轮子造起 — 那对组件技术及软件工程是一大嘲讽。然而对于一个想要深度钻研STL以便拥有扩充能力的人,相当程度地追踪STL源代码是必要的功课。是的,对于一个想要充实数据结构与算法等固有知识,并提升泛型编程技法的人,“入太庙每事问”是必要的态度,追踪STL源代码则是提升功力的极佳路线。
想要良好运用STL,我建议你看《The C++ Standard Library》by Nicolai M. Josuttis;想要严谨认识STL 的整体架构和设计思维,以及STL的详细规格,我建议你看 《Generic Programming and the STL》by Matthew H. Austern;想要从语法层面开始,学理与应用得兼,宏观与微观齐备,我建议你看《泛型思维》by侯捷;想要深入STL实现技法,一窥大家风范,提升自己的编程功力,我建议你看你手上这本《STL 源代码剖析》— 事实上就在下笔此刻,你也找不到任何一本相同定位的书[2]。
合适的读者
本书不适合STL 初学者(当然更不适合C++ 初学者)。本书不是面向对象(Object Oriented)相关书籍。本书不适合用来学习 STL的各种应用。
对于那些希望深刻了解STL 实现细节,俾得以提升对STL的扩充能力,或是希望藉由观察STL源代码,学习世界一流程式员身手,并藉此彻底了解各种被广泛运用之数据结构和算法的人,本书最适合你。
最佳阅读方式
无论你对STL认识了多少,我都建议你第一次阅读本书时,采循序渐进方式,遵循书中安排的章节先行浏览一遍。视个人功力的深浅,你可以或快或慢并依个人兴趣或需要,深入其中。初次阅读最好循序渐进,理由是,举个例子,所有容器(containers)的定义式一开头都会出现空间配置器(allocator)的运用,我可以在最初数次提醒你空间配置器于第2章介绍过,但我无法遍及全书一再一再提醒你。又例如,源代码之中时而会出现一些全局函数调用动作,尤其是定义于 [stl_construct.h] 之中用于对象建构与解构的基本函数,以及定义于 [stl_uninitialized.h] 之中用于内存管理的基本函数,以及定义于 [stl_algobase.h] 之中的各种基本算法。如果那些全局函数已经在先前章节介绍过,我很难保证每次都提醒你 — 那是一种顾此失彼、苦不堪言的劳役,并且容易造成阅读上的累赘。
我所选择的剖析对象
本书名为《STL源代码剖析》,然而STL 实作品百花齐放,不论就技术面或可读性,皆有高下之分。选择一份好的实现版本,就学习而言当然是极为重要的。我选择的剖析对象是声名最盛,也是我个人评价最高的一个产品:SGI(Silicon Graphics Computer Systems, Inc.)版本。这份由 STL 之父Alexander Stepanov、经典书籍《Generic Programming and the STL》作者 Matthew H. Austern、STL 巨匠David Musser 等人投注心力的STL实现版本,不论在技术层次、源代码组织、源代码可读性上,均有卓越的表现。这份产品被纳为GNU C++ 标准程序库,任何人皆可从网际网络上下载GNU C++ 编译器,从而获得整份STL源代码,并获得自由运用的权力(详见1.8节)。
我所选用的是cygnus[3] C++ 2.91.57 for Windows版本。我并未刻意追求最新版本,一来书籍不可能永远呈现最新的软件版本 — 软件更新永远比书籍改版快速,二来本书的根本目的在建立读者对于STL巨观架构和微观技术的掌握,以及源代码的阅读能力,这种核心知识的形成与源代码版本的关系不是那么唇齿相依,三来SGI STL 实作品自从搭配GNU C++2.8 以来已经十分稳固,变异极微,而我所选择的2.91版本,表现相当良好;四来这个版本的源代码比后来的版本更容易阅读,因为许多内部变量名称并不采用下划线(underscore) — 下划线在变量命名规范上有其价值,但到处都是下划线则对大量阅读相当不利。
网络上有个STLport(http://www.stlport.org)站点,提供一份以SGI STL 为蓝本的高度可移植性实现版本。本书附录C列有孟岩先生所写的文章,是一份STLport移植到Visual C++ 和C++ Builder 的经验谈。
各章主题
本书假设你对STL已有基本认识和某种程度的运用经验。因此除了第一章略作介绍之外,立刻深入STL技术核心,并以STL 六大组件(components)为章节之进行依据。以下是各章名称,这样的次序安排大抵可使每一章所剖析的主题能够于先前章节中获得充份的基础。当然,技术之间的关连错综复杂,不可能存在单纯的线性关系,这样的安排也只能说是尽最大努力。
第1章 STL 概论与实现版本简介
第2章 空间配置器(allocator)
第3章 迭代器(iterators)概念与 traits 编程技法
第4章 序列式容器(sequence containers)
序言回到顶部↑
庖丁解牛[1]
侯捷自序
这本书的写作动机,纯属偶然。
2000年下半,我开始为计划中的《泛型思维》一书陆续准备并热身。为了对泛型编程技术以及STL实现技术有更深的体会,以便在讲述整个STL的架构与应用时更能虎虎生风,我常常深入到STL源码去刨根究底。2001/02 的某一天,我突然有所感触:既然花了大把精力看过STL 源码,写了眉批,做了整理,何不把它再加一点功夫,形成一个更完善的面貌后出版?对我个人而言,一份批注详尽的STL源码,价值不扉;如果我从中获益,一定也有许多人能够从中获益。
这样的念头使我极度兴奋。剖析大架构本是侯捷的拿手,这个主题又可以和《泛型思维》相呼应。于是我便一头栽进去了。
我选择SGI STL 做为剖析对象。这份实现版本的可读性极佳,运用极广,被选为GNU C++ 的标准程序库,又开放自由运用。愈是细读 SGI STL源码,愈令我震惊抽象思考层次的落实、泛型编程的奥妙、及其效率考量的缜密。不仅最为人广泛运用的各种数据结构(data structures)和算法(algorithms)在STL中有良好的实现,连内存配置与管理也都重重考虑了最佳效能。一切的一切,除了实现软件积木的高度复用性,让各种组件(components)得以灵活搭配运用,更考量了实用上的关键议题:效率。
这本书不适合C++ 初学者,不适合 Genericity(泛型技术)初学者,或 STL 初学者。这本书也不适合带领你学习面向对象(Object Oriented)技术 — 是的,STL 与面向对象没有太多关连。本书前言清楚说明了书籍的定位和合适的读者,以及各类基础读物。如果你的Generic Programming/STL实力足以阅读本书所呈现的源码,那么,恭喜,你踏上了基度山岛,这儿有一座大宝库等着你。源码之前了无秘密,你将看到vector的实现、list的实现、heap的实现、deque的实现、RB-tree的实现、hash-table的实现、set/map 的实现;你将看到各种算法(排序、搜寻、排列组合、数据移动与复制…)的实现;你甚至将看到底层的memory pool 和高阶抽象的traits 机制的实现。那些数据结构、那些算法、那些重要观念、那些编程实务中最重要最根本的珍宝,那些蜇伏已久彷佛已经还给老师的记忆,将重新在你的脑中闪闪发光。
人们常说,不要从轮子重新造起,要站在巨人的肩膀上。面对扮演轮子角色的这些STL 组件,我们是否有必要深究其设计原理或实现细节呢?答案因人而异。从应用的角度思考,你不需要探索实现细节(然而相当程度地认识底层实现,对实务运用有绝对的帮助)。从技术研究与本质提升的角度看,深究细节可以让你彻底掌握一切;不论是为了重温数据结构和算法,或是想要扮演轮子角色,或是想要进一步扩张别人的轮子,都可因此获得深厚扎实的基础。
天下大事,必作于细!
参观飞机工厂不能让你学得流体力学,也不能让你学会开飞机。然而如果你会开飞机又懂流体力学,参观飞机工厂可以带给你最大的乐趣和价值。
我开玩笑地对朋友说,这本书出版,给大学课程中的“数据结构”和“算法”两门授课老师出了个难题。几乎所有可能的作业题目(复杂度证明题除外),本书都有了详尽的解答。然而,如果学生能够从庞大的 SGI STL 源码中干净抽出某一部份,加上自己的包装,做为呈堂作业,也足以证明你有资格获得学分和高分。事实上,追踪一流作品并于其中吸取养份,远比自己关起门来写个三流作品,价值高得多 — 我的确认为99.99 % 的程序员所写的程序,在 SGI STL 面前都是三流水准 J。
侯捷2001/05/30 新竹 § 台湾
http://www.jjhou.com (繁体)
http://jjhou.csdn.net (简体)
jjhou@jjhou.com
p.s. 以下三书互有定位,互有关联,彼此亦相呼应。为了不重复讲述相同的内容,我会在适当时候提醒读者在哪本书上获得更多资料:
l 《多型与虚拟》,内容涵括:C++ 语法、语意、对象模型,对象导向精神,小型framework实现,OOP专家经验,设计模式(design patterns)导引。
l 《泛型思维》,内容涵括:语言层次(C++ templates 语法、Java generic 语法、C++ 操作符重载),STL 原理介绍与架构分析,STL 现场重建,STL 深度应用,STL扩充示范,泛型思考。
《STL源码剖析》,内容涵括:STL所有组件之实现技术和其背后原理解说。
--------------------------------------------------------------------------------
侯捷自序
这本书的写作动机,纯属偶然。
2000年下半,我开始为计划中的《泛型思维》一书陆续准备并热身。为了对泛型编程技术以及STL实现技术有更深的体会,以便在讲述整个STL的架构与应用时更能虎虎生风,我常常深入到STL源码去刨根究底。2001/02 的某一天,我突然有所感触:既然花了大把精力看过STL 源码,写了眉批,做了整理,何不把它再加一点功夫,形成一个更完善的面貌后出版?对我个人而言,一份批注详尽的STL源码,价值不扉;如果我从中获益,一定也有许多人能够从中获益。
这样的念头使我极度兴奋。剖析大架构本是侯捷的拿手,这个主题又可以和《泛型思维》相呼应。于是我便一头栽进去了。
我选择SGI STL 做为剖析对象。这份实现版本的可读性极佳,运用极广,被选为GNU C++ 的标准程序库,又开放自由运用。愈是细读 SGI STL源码,愈令我震惊抽象思考层次的落实、泛型编程的奥妙、及其效率考量的缜密。不仅最为人广泛运用的各种数据结构(data structures)和算法(algorithms)在STL中有良好的实现,连内存配置与管理也都重重考虑了最佳效能。一切的一切,除了实现软件积木的高度复用性,让各种组件(components)得以灵活搭配运用,更考量了实用上的关键议题:效率。
这本书不适合C++ 初学者,不适合 Genericity(泛型技术)初学者,或 STL 初学者。这本书也不适合带领你学习面向对象(Object Oriented)技术 — 是的,STL 与面向对象没有太多关连。本书前言清楚说明了书籍的定位和合适的读者,以及各类基础读物。如果你的Generic Programming/STL实力足以阅读本书所呈现的源码,那么,恭喜,你踏上了基度山岛,这儿有一座大宝库等着你。源码之前了无秘密,你将看到vector的实现、list的实现、heap的实现、deque的实现、RB-tree的实现、hash-table的实现、set/map 的实现;你将看到各种算法(排序、搜寻、排列组合、数据移动与复制…)的实现;你甚至将看到底层的memory pool 和高阶抽象的traits 机制的实现。那些数据结构、那些算法、那些重要观念、那些编程实务中最重要最根本的珍宝,那些蜇伏已久彷佛已经还给老师的记忆,将重新在你的脑中闪闪发光。
人们常说,不要从轮子重新造起,要站在巨人的肩膀上。面对扮演轮子角色的这些STL 组件,我们是否有必要深究其设计原理或实现细节呢?答案因人而异。从应用的角度思考,你不需要探索实现细节(然而相当程度地认识底层实现,对实务运用有绝对的帮助)。从技术研究与本质提升的角度看,深究细节可以让你彻底掌握一切;不论是为了重温数据结构和算法,或是想要扮演轮子角色,或是想要进一步扩张别人的轮子,都可因此获得深厚扎实的基础。
天下大事,必作于细!
参观飞机工厂不能让你学得流体力学,也不能让你学会开飞机。然而如果你会开飞机又懂流体力学,参观飞机工厂可以带给你最大的乐趣和价值。
我开玩笑地对朋友说,这本书出版,给大学课程中的“数据结构”和“算法”两门授课老师出了个难题。几乎所有可能的作业题目(复杂度证明题除外),本书都有了详尽的解答。然而,如果学生能够从庞大的 SGI STL 源码中干净抽出某一部份,加上自己的包装,做为呈堂作业,也足以证明你有资格获得学分和高分。事实上,追踪一流作品并于其中吸取养份,远比自己关起门来写个三流作品,价值高得多 — 我的确认为99.99 % 的程序员所写的程序,在 SGI STL 面前都是三流水准 J。
侯捷2001/05/30 新竹 § 台湾
http://www.jjhou.com (繁体)
http://jjhou.csdn.net (简体)
jjhou@jjhou.com
p.s. 以下三书互有定位,互有关联,彼此亦相呼应。为了不重复讲述相同的内容,我会在适当时候提醒读者在哪本书上获得更多资料:
l 《多型与虚拟》,内容涵括:C++ 语法、语意、对象模型,对象导向精神,小型framework实现,OOP专家经验,设计模式(design patterns)导引。
l 《泛型思维》,内容涵括:语言层次(C++ templates 语法、Java generic 语法、C++ 操作符重载),STL 原理介绍与架构分析,STL 现场重建,STL 深度应用,STL扩充示范,泛型思考。
《STL源码剖析》,内容涵括:STL所有组件之实现技术和其背后原理解说。
--------------------------------------------------------------------------------
相关资源回到顶部↑
· 【推荐】众多高校学子口口相传,他们共同的选择--华清远见嵌入式学院(嵌入式Linux就业课程、3G手机开发就业课程,通过入学测试即签100%就业协议,4个月集中实训,世界500强企业成功就业保障!!!)· 【亚嵌教育 嵌入式培训专家】(嵌入式培训,嵌入式Linux培训,ARM培训,Linux培训,3G培训,Android培训,WINCE培训,DSP培训,FPGA培训,嵌入式就业培训)
· 程序员的7种武器(正则表达式、编程语言、数据库、算法、软件调试、开发环境)
· C/C++ 经典著作(《C专家编程》《C++ Templates中文版》《C和指针 》《C陷阱与缺陷》《C++沉思录》)









加载中...
