以下,我便为各位介绍六本相关书籍,涵盖不同的切入角度,也涵盖上述三个学习层次。首先的两本是着名的 C++ 百科型书籍,我只挑其中与 STL 相关的章节做介绍。为求方便,以下以学术界习惯的标示法,标示书籍代名。本文使用这些代名。凡有中文版者,我会特别加注。 [Lippman98]: C++ Primer, 3rd Editoin, by Stanley Lippman and Josee Lajoie, Addison Wesley Longman, 1998. 1237 pages. 繁体中文版:《》,侯捷译, 峰 1999. 1237 页 http://jjhou.csdn.net/cpp-primer-3e-l.gif [Struostrup97]: The C++ Programming Language, 3rd Editoin, by Bjarne Stroustrup, Addison Wesley Longman, 1997. 910 pages 繁体中文版:《C++ 程式语言经典本》,叶秉哲译,儒林 1999.(未录总页数) http://jjhou.csdn.net/bjarne.jpg [Josuttis99]: The C++ Standard Library - A Tutorial and Reference, by Nicolai M. Josuttis, Addison Wesley 1999. 799 pages 繁体中文版:侯捷计划中 http://jjhou.csdn.net/the-cpp-standard-library.jpg [Austern98]: Generic Programming and the STL - Using and Extending the C++ Standard Template Library, by Matthew H. Austern, Addison Wesley 1998. 548 pages 繁体中文版:《》,侯捷/黄俊尧合译, 峰 2000。548页 http://jjhou.csdn.net/generic-programming-and-stl.jpg [Jjhou01]: 泛型技术 - 从具象工具到抽象思维, by 侯捷, 峰 2001. 页数未定 简体中文版:洽谈中 http://jjhou.csdn.net/genericity-in-cpp.jpg [Gamma95]: : Elements of Reusable Object-Oriented Software, by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides, Addison-Wesley, 1995. 395 pages 简体中文版:《设计模式》,李英军等译,机械工业出版社,2000. 254 页 http://jjhou.csdn.net/design-patterns-l.gif http://jjhou.csdn.net/urbhorsa.gif ●第零境界:泛型技术的基本门槛 在 C++ 环境中学习泛型技术,首要是把 template 相关语法与语意搞清楚。包括 class templates, function templates, member templates, specialization, partial specialization。更往基础看去,由於 STL 大量运用了 operater overloading(运算子多载化),所以这个技法也必须熟捻。 [Lippman98] 是一本 C++ 百科全书,向以内容广泛说明详尽着称。本书内容与 template 及 STL 直接相关的章节有: chap6: Abstract Container Types chap10: Function Templates chap12: The Generic Algorithms chap16: Class Templates appendix: The Generic Algorithms Alphabetically 间接相关的章节有: chap15: Overloaded Operators and User Defined Conversions 书中有大量范例,尤其附录列出所有的 STL 泛型演算法的规格、说明、实例,是极佳的学习资料。不过书上有极少数例子,因为作者的疏忽,未能完全遵循 C++ 标准,仍沿用旧式写法。更正作法可上繁体版支援网站(侯捷网站)看看。此书的学习方式以及华人读者的技术讨论也都可在繁体版支援网站上看到。 [Struostrup97] 也是一本 C++ 百科全书,向以学术权威(以及涩味极重)着称。若非具备一定程度,对於书中内容的表达方式,浅尝之下会有艰涩的口感。本书内容与 template 及 STL 直接相关的章节有: chap3: A Tour of the Standard Library chap13: Templates chap16: Library Organization and Containers chap17: Standard Containers chap18: Algorithms and Function Objects chap19: Iterators and Allocators 间接相关的章节有: chap11: Operator Overloading 第 19 章对 Iterators Traits 技术的介绍,在 C++ 语法书中难得一见,但此为正面或负面殊难定论,因为你必须知道 Traits 技术之发展原由(问题之所在),才能够了解为什麽变成现在这般抽象模样。当然,我们不能期望一本 C++ 语言书籍对此有深刻的表现,但是这麽高阶的技术,蜻蜓点水式的说明并不会引导出阅读的兴趣,反而可能会重挫读者的信心。关於 Traits 技术,[Austern98] 表现极佳。 上面所说的这两本 C++ 百科全书,基本上并不是以介绍泛型技术的角度出发,而是以「C++ 涵盖了 template 和 STL,所以我介绍它」的态度出发。因此,在相关组织上,稍嫌凌乱。不过我想,没有人会因此对他们求全责备。 ●第一境界:熟用 STL 一旦你开始学习 STL,乃至开始实际运用 STL,[Josuttis99] 绝对可以为你节省大量的翻查、叁考、错误尝试的时间。本书各章如下: 1. About the Book 2. Introduction to C++ and the Standard Library 3. General Concepts 4. Utilities 5. The Standard Template Library 6. STL Containers 7. STL Iterators 8. STL Function Objects 9. STL Algorithms 10 Special Containers 11 Strings 12 Numerics 13 Input/Output Using Stream Classes 14 Internationalization 15 Allocators Internet Resources Bibliography Index 正如其副标所示「本书兼具学习用途及叁考价值」,既不夸张也当之无愧。本书涵盖的不仅是 STL,而是整个 C++ 标准程式库,详细介绍每一个组件的规格及运用方式,并佐以范例。作者的整理功夫做得非常好非常扎实。在观念解说方面,经常以图表形式让读者一目了然。 由於本书介绍的对象是整个 C++ 标准程式库,所以少见於其他书籍的某些组件,如 valvarry, mem_fun, ptr_fun, locales 等等,也都涵盖其中。标准程式库的几个大家伙,像是 string, iostream, locale, 也都有极具水准的介绍。本书的另一个特色是,对於与 STL 相关的各种异常讯息(exceptions),亦有介绍。这很少见。 [Josuttis99] 不仅介绍 STL 组件的运用,也导入 STL 的源码。这些源码都经过作者的节录整理,砍去枝节,留下主干,较易入目。这是我对此书最激赏的一部份。换句话说,阅读此书,不但进入我所说的第一学习境界,甚且进入了第二境界。这种对於白盒子(注)的阐释方式和侯捷的写作风格十分近似,我一向也喜欢繁中取简,在百万军中取敌首级。这可不是容易的动作,首先得对庞大的源码有清晰的认识,再有自己的诠释主轴,知道什麽要砍,什麽要留,什麽要注解。 注:附源码的工具我们称为白盒子,未附源码者我们称为黑盒子。 本书也适度介绍某些 STL 扩充技术。例如 6.8 节介绍如何以 smart pointer 使 STL 容器具有 "reference semantics" (原本 STL 容器只支援 "value semantics")。又例如 7.5.2 节介绍一个订制型 iterator,10.1.4 节介绍一个订制型 stack,10.2.4 节介绍一个订制型 queue。15.4 节介绍一个订制型 allocator。虽然都只短短一些篇幅,列出基本技法,但对於想要扩充 STL 的程式员而言,起了个头,终究是一种实质上的莫大帮助。就这点而言,本书又进入了我所说的第三学习境界。 通常,英文电脑书的字体都相当小,程式码尤其更小。本书字行之间的距离特别大些,程式码与书後索引尤然。阅读时眼睛应该轻松不少。喜欢以「页数/售价 比」来评断书籍的人,这下会高兴些了,系数高不少嘛 ─ 真像朝三暮四里头的猴子!盼望书籍轻一点薄一点便利携带的人,则可能略有愠意。我常在 BBS/News 上看到一些关於书厚薄与书价格的言论,令人发噱。有人拿侯捷的《深入浅出 MFC》比鹿挢的《未央歌》,说两本都是好书,但买一本《深入浅出 MFC》可买五本未央歌,言下之意不以为然。真是苹果比橘子,张飞战岳飞! 基本上谈书的价值,不应该扯上书的价格与页数。谈书的价格,则不应该扯上书的页数。我对买卖的看法是这样:电脑书不是写真集,没有用保鲜膜包起来,内容与页数都明白呈现你的眼前;你愿意买,就表示你承认它的价值匹配它的价格;否则就别买。我对书价的看法则是这样:书籍是卖知识,不是卖纸,重要的是含金量,不是页数与厚薄。如果你不愿意花比较多的钱买比较好的书,你还期望别人花比较多的精力与比较高的成本写作/出版好书吗? 话说远了。让我们回到主题。 ●第二境界:了解泛型技术的内涵与 STL 的学理 [Austern98] 是一本艰深的书。没有三两三,别想过梁山,你必须对 C++ template 技法、STL 的运用、泛型设计的基本精神都有相当基础了,才得一窥此书堂奥。 本书第一篇对 STL 的设计哲学有很好的导入,第二篇是详尽的 STL concepts 完整规格,第三篇则是详尽的 STL components 完整规格,并附运用范例。 PartI : Introduction to Generic Programming 1. A Tour of the STL 2. Algorithms and Ranges 3. More about Iterators 4. Function Objects 5. Containers PartII : Reference Manual: STL Concepts 6. Basic Concepts 7. Iterators 8. Function Objects 9. Containers PartIII : Reference Manual : Algorithms and Classes 10. Basic Components 11. Nonmutating Algorithms 12. Basic Mutating Algorithms 13. Sorting and Searching 14. Iterator Classes 15. Function Object Classes 16. Container Classes Appendix A. Portability and Standardization Bibliography Index 本书通篇强调 STL 的泛型理论基础,以及 STL 的实作规格。你会看到 conecpt, model, refinement, range, iterator 等字词的意义,也会看到诸如 Assignable, Default Constructible, Equality Comparable 等观念的严谨定义。我绝对不赞成在讨论、思考这些知识时,将这些原文术语转换为中文来使用,那会非常令自己和同伴感到困惑。所幸目前为止应该不存在这样的困扰,因为泛型的中文书籍(不论着译)非常少,不至於对那些可能不够统一、不够明确的中文术语推波助澜。 虽然一本既富学术性又带叁考价值的工具书,给人严肃又艰涩的表象,但本书第二章及第三章解释 iterator 和 iterator traits 时的表现,却让我不由自主地击节赞赏,大叹精彩。当我藉由这两章彻底解放了 traits 编程技术,并因而有能力观看 STL 源码(STL 源码几乎无所不在地运用 traits 技术)、撰写符合规格的自定型 STL 组件,我真不禁要激越昂扬,仰天长啸。 traits 是 STL 的关键编程技术。这个观念无法在这里三言两语带出,我就不多费事儿了。[Austern98] 书中那麽好的解说与导引,你自个儿去看。 就像其他任何 framework 一样,STL 以开放原始码的方式呈现市场。这种白盒子方式,使我们在更深入剖析其技术时(可能是为了透彻,可能是为了扩充),有一个终极依恃。因此,观看 STL 源码的能力,我认为对技术的养成与掌握,极为重要。 总的来说,本书在 STL 规格及 STL 学理概念的资料及说明方面,目前书市无有出其右者。我个人在元智大学开授一门「泛型程式设计」课程,[Austern98] 便是我指定给同学的高阶叁考书。本书在 (1) 泛型观念之深入浅出、(2) STL 架构组织之井然剖析、(3) STL 叁考文件之详实整理 三方面,均有卓越表现。可以这麽说,在泛型技术和 STL 的学习道路上,本书并非万能(它不适合初学者),但如果你希望彻底掌握泛型技术与 STL,没有此书万万不能。 ●第三境界:扩充 STL 要撰写与 STL 相容 ─ 也就是可以和 STL 组件自由拼凑组装在一起 ─ 的个人自定组件,我们需要两种书籍。你已经知道,STL 的背後是一个严谨的「软体概念分类学」,为了与 STL 水乳交融,自定组件一定必须满足那严谨的架构 ─ 回头看看图一那张 vector 概念衍化图吧。因此,我们首先需要一份详尽的 STL concepts 规格书,而 [Austern98] 正是最好的(可能也是唯一的)候选人。 第二,万事起头难,我们可能需要足够的范例,带引我们上路。目前市面上缺乏这样的书籍。我看过 "Designing Components with the C++ STL",书名很吸引人,实则未能进入侯捷的推荐名单。幸好 [Josuttis99] 分担了部份这样的角色,聊堪倚仰。 ●侯捷的理想 做为一个对泛型思维及 STL 产品有深刻体会的人,本身又是一名技术写作者,我不可能没有自己的论述理想。 由於泛型与 STL 对许多人而言,相对之下毕竟是新鲜玩意儿,语言层面的技法也还算新鲜而高阶,所以我希望为读者铺陈一条由摇篮到坟墓的路。从 C++ 相关语法、到 traits 编程技术、到 STL 的各种运用,再到 STL 的学理探究,最後示范数个扩充组件。一书而竟全功。具叁考价值的查阅型工具书我写不来(那需要完备的资料和大量的细心),观念阐述型的书籍则是我的拿手,也是我的兴趣。 下面便是暂名「泛型技术 - 从具象工具到抽象思维」的 [Jjhou01] 新书目录(暂定)。 第1章 泛型大局观(Overview of Generic Programming) 第2章 C++ 运算子多载化(Operator Overloading)基本技法 第3章 C++ 泛型基本技法 (1):Function Template 第4章 C++ 泛型基本技法 (2):Class Template 第5章 Traits 编程技法 第6章 Iterator(泛型指标) 第7章 Container(容器) 第8章 Function Object(函式物件) 第9章 Generic Algorithms(泛型演算法) 第10章 Adaptor(配适器) 第11章 Allocator(记忆体配置器) 附录 叁考书目 索引 Index 当你看到这篇文章的同时,我正在台湾南部的一个农村,我的老家,做这本书的最後整理。 ●旁徵博引 左右逢源 [Gamma95] 与泛型或 STL 并没有直接关系。但是 STL 有两大类组件,却被收录於 [Gamma95] 的 23 个设计样式(design patterns)中:Iterator 和 Adaptor。其他设计样式在 STL 之中也有所发挥。两相比照,尤其是看过 STL 的源码之後,对於这些设计样式会有更深的体会,返映过来面对 STL 也会有更深一层的体会. ●一点感想 自从被全球软体界广泛运用以来,C++ 有了许多演化与变革。然而就像人们总是把目光放在艳丽的牡丹而忽略了花旁的绿叶,做为一个广为人知的物件导向程式语言(Object Oriented Programming Language),C++ 所支援的另一种思维 ─ 泛型编程 ─ 被严重忽略了。说什麽红花绿叶,好似主观上划分了主从,其实物件导向思维和泛型思维两者之间无所谓主从。两者相辅相成,肯定能对程式开发有更大的突破。 永远记住,面对新技术,程序员最大的障碍在於心中的怯弱。To be or not to be, that is the question! 不要和哈姆雷特一样犹豫不决,当你面对一项有用的技术,必须果敢。 --- the end |