Programming 版 (精华区)
发信人: JZY (Jason), 信区: Programming
标 题: 巨细披靡 竟然有序(转载)
发信站: 哈工大紫丁香 (2002年05月28日19:58:12 星期二), 站内信件
以下转载自候捷网站(jjhou.csdn.net)
----------------------------------------------------------------------------
----
巨细靡遗 井然有序
《C++ 标准程式库》侯捷译序
----------------------------------------------------------------------------
----
自从1998年C++ Standard定案以後,C++ 程式库便有了大幅扩充。原先为大家所熟知、
标准规格定案前蕴酿已久的STL(Standard Template Library,标准模板程式库),不
再被单独对待,而是被纳入整个C++ 标准程式库(Standard Library)。同时,原有的
程式库(如iostream)也根据泛型技术(generics)在内部上做了很大的修改。可以说
,C++ Standard的发布对C++ 社群带来了翻天覆地的大变动 ─ 不是来自语言本身,而
是来自标准程式库。这个变动,影响C++ 程式编写风格至巨,C++之父Bjarne Stroustr
up并因此写了一篇文章:Learning Standard C++ as a New Language(载於C/C++ Use
r's Journal, 1999/05)。
我个人於1998年开始潜心研究泛型技术和STL,本书英文版《The C++ Standard Librar
y》甫一出版便成为我学习C++ 标准程式库的最重要案头工具之一。小有心得之後,我写
过数篇相关技术文章,从来离不开本书的影响和帮助。我曾经把STL(代表泛型技术目前
最被广泛运用的一个成熟产品,也是C++ 标准程式库的绝大成份)的学习比喻为三个阶
段(或层次):
第一境界:熟用STL
第二境界:了解泛型技术的内涵与STL的学理乃至实作
第三境界:扩充STL
不论哪一个阶段,你都能够从本书获得不同程度的帮助。
第一阶段(对最大多数程式员有立竿见影之效),我们需要一本全面而详尽的教本,附
带多量而设计良好的范例,带领我们认识十数个STL容器(containers)、数十个STL演
算法(algorithms)、许许多多的迭代器(iteartors)、配接器(adapters)、仿函式
(functors)┅的各种特性和用途。这些为数繁多的组件必须经过良好的编排组织和索
引,才能成就一本效果良好、富教育性又可供长久查阅的案头工具书。
在这一阶段里,本书表现极为优异。书中运用许多图表,对所有STL组件的成员做了极其
详尽的整理。更值得称道的是书中交叉叁考(cross reference)做得非常好,在许多关
键地点告诉读者当下可叁见哪一章哪一节哪一页,对於阅读和学习带来很大的帮助(本
中文版以页页对译方式保留了所有交叉叁考和索引)。
第二阶段(从STL的运用晋升至泛型技术的学习),我们需要一些关键的STL源码(或伪
码, pseudo code),帮助我们理解关键的资料结构、关键的编程技术。认识这些关键源
码(或伪码)同时也有助提升第一阶段的运用深度(学会使用一样东西,却不知道它的
道理,不高明J 注1)。
本书很多地方都提供了C++ 标准程式库的关键源码。不全面,但很关键。
注1:乍见之下令人错愕的一句话。看电视需要先了解电视的原理吗?呵呵,话讲白就没
意思了。这句话当然是对技术人员说的。
第三阶段(成为一位泛型技术专家;打造自己的STL相容组件),我们需要深入了解STL
的设计理念和组织架构(注2),并深入(且全面地)了解STL实作手法(注3)。是的,
不入虎穴,不能得虎子;彻底了解STL如何被打造出来之後,你才能写出和STL水乳交融
、完美整合的自定组件(user-defined components)。
本书对第三阶段的学习也有相当帮助。虽然没能提供全面的STL源码并分析其技术(那需
要另外800页J ),却提供了为数不少的订制型组件实作范例:p191, p213提供了一个执
行期指定排序准则并运用不同排序准则的实例,p219提供一个自定容器(虽然只是个简
单的包覆类别),p222提供一个「reference语意」示范作法, p285提供一个针对迭代
器而设计的泛型演算法,p288提供一个用於关联式容器的订制型inserter,p294有一个
自定的排序准则,p441有一个自定的(安全的)stack,p450有一个自定的(安全的)q
ueue,p504有一个自定的traits class for string, p614有一个自定的stream操控器
,p663有一个自定的stream缓冲区,p735有一个自定的记忆体配置器(allocator)。
注2:这方面我推荐你看《Generic Programming and the STL - Using and Extending
the C++ Standard Template Library》, by Matthew H. Austern, Addison Wesley
1998。详见稍後说明。中译本《泛型程式设计与STL》,侯捷/黄俊尧合译, 峰, 2001。
注3:这方面我推荐你看《STL源码剖析, The Annotated STL Sources》by 侯捷, 峰,
2002。详见稍後说明。
除了众所瞩目的STL,本书也涵盖一般不被归类为STL的String程式库,以及一般不被视
为关键的IOStream和Locale程式库(注4)。三部分互有关连,以IOStream为主干。在G
UI(图形使用介面)和application framework(应用程式框架)当道的今天,IOStrea
m提供的输出输入可能对大部份人失去了价值,但如果你希望开拓OO技术视野,IOStrea
m是一颗沉睡的珠宝。
注4:这方面仅见的专着是《Standard C++ IOStreams and Locales - Advanced Progr
ammer's and Reference》, by Angelika Langer and Klaus Kreft, Addison Wesley
2000。
v v v
泛型技术不仅在C++ 被发扬光大,在Java上也有发展(注5),在C# 上亦被众人期待。
从目前的势头看,泛型技术(Generics)或许是物件导向(Object Oriented)技术以来
程式编写方面的又一个巨大冲击。新一代C++ 标准程式库(注6)将采用更多更复杂更具
威力的泛型技术,提供给C++ 社群更多更好更具复用价值的组件。
注5:(1) GJ : A Generic Java, by Philip Wadler, Dr. Dobb's Journal February
2000. (2) JSR- 000014 : Adding Generics to the Java Programming Language,
http://jcp.org/aboutJava/communityprocess/review/jsr014/index.html
注6:请叁考http://www.boost.org/,此物据称将成为下一代 C++标准。
不论你要不要、想不想、有没有兴趣在你的程式编写过程中直接用上泛型技术,至少,
在C++ 程式编写过程中你已经不可或缺於泛型技术带来的成熟产品:C++ 标准程式库。
只要你具备C++ 语言基础,本书便可以带领你漂亮地运用C++ 标准程式库,漂亮地提升
你的编程效率和程式品质。
面对陌生,程式员最大的障碍在於心中的怯弱。To be or not to be, that is the qu
estion! 不要像哈姆雷特一样犹豫不决。面对光明的技术,必须果敢。
v v v
关於术语的处理,本书大致原则如下:
STL各种资料结构名称皆不译,例如array, vector, list, deque, hast table, map,
set, stack, queue, tree┅。虽然其中某些已有约定俗成的中文术语,但另一些没有既
标准又被普遍运用的中文名称,强译之读者瞠目以对,部分译部分不译则阅读时词性平
衡感不佳(例如「面对向量和deque两种容器┅」就不如「面对vector和deque两种容器
┅」读起来顺畅)。因此,资料结构名称全部不译。直接呈现这些简短的英文术语,可
能营造更突出的视觉效果,反而有利阅读。技术书籍的翻译不是为了建立全中文化阅读
环境,我们的读者水平也不可能受制於这些英文单字。
STL六大组件的英文名称原打算全部保留,但由於处处出现,对版面的中英文比例形成视
觉威胁,因此全部采用以下译名:container容器,algorithm演算法,iterator迭代器
,adapter配接器,functor仿函式(注7),allocator配置器。
任何一个被保留的英文关键术语,其第一次(或前数次)出现时尽可能带上中文名称。
同样地,任何关键的中文术语,我也会时而让它中英并陈。
注7:原书大部份时候使用function object函式物件一词,为求精简及突出,中文版全
部改用其另一个名称functor仿函式(见第8章译注)。
v v v
关於编排,本书原则如下:
全书按英文版页次编排,并因而得以保留原书索引。索引词条皆不译。
中文版采用之程式码字体(Courier New 8.5)比文本字体(细明体9.5)小,英文版之
程式码字体却比其文本字体大,且行距宽。因此中文版遇有大篇幅程式列表,为保持和
英文版页次相应,便会出现较多留白。根据我个人对书籍的经验,去除这些留白的最後
结果亦不能为全书节省五页十页;填满每一处空白却丧失许多立即可享的好处,智者不
取J 。
v v v
一旦你从本书获得了对C++ 标准程式库运用层面的全盘掌握与实践经验之後,可能希望
对STL原理乃至实作技术做更深的研究,或甚至对泛型编程(Generic Programming)产
生无比狂热。在众多相关书籍之中,下面是我认为非常值得继续进修的四本书:
《Generic Programming and the STL - Using and Extending the C++ Standard Tem
plate Library》, by Matthew H. Austern, Addison Wesley 1998。本书第一篇(前五
章)谈论STL的设计哲学、程式库背後的严密架构和严谨定义。其中对於STL之异於一般
程式库,有许多重要立论。其馀部分(第二篇、第三篇)是STL的完整规格(分别从con
cepts的角度和components的角度来阐述),并附范例程式。
《STL源码剖析, The Annotated STL Sources》by 侯捷, 峰, 2002。本书剖析 STL实作
技法,详实揭示并注解STL六大组件的底层实作,并以公认最严谨的SGI(Silicon Grap
hics Inc.)STL版本为剖析对象。附许多精彩分析图,对於高度精巧的记忆体配置策略
、各种资料结构、各种演算法、乃至极为「不可思议」的配接器(adapter)实作手法,
都有深入的剖析。
《Effective STL》, by Scott Meyers, Addison Wesley 2001。本书定位为STL的深层
运用。在深层运用的过程中,你会遇到一些难解的问题和效率的考量,你需要知道什麽
该做、什麽该避免。本书提供50个专家条款。请注意,深层运用和效率调校,可能需要
读者先对底部机制有相当程度的了解。
《Modren C++ Design》by Andrei Alexandrescu, Addison Wesley 2001。将泛型技术
发挥到淋漓尽致、令人目瞪口呆的一本书籍。企图将泛型技术和设计样式(design pat
terns)结合在一起。领先时代开创先河的一本书。
v v v
本书由我和孟岩先生共同完成。孟岩在大陆技术论坛以C++/OO/Generics驰名,见解深隽
文笔不凡。我很高兴和他共同完成这部作品。所谓合译,我们两人对全书都有完整的叁
与(而非你一半我一半的对拆法),最终由我定稿。本书同时发行繁体版和简体版,基
於两岸计算机术语的岐异性,简体版由孟岩负责必要转换。
侯捷 2002/05/23 于新竹
http://www.jjhou.com(繁体网站)
http://jjhou.csdn.net(简体网站)
jjhou@jjhou.com(个人电子邮箱)
--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.229.69]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.999毫秒