致谢

优质
小牛编辑
130浏览
2023-12-01

在我理解STL、建立关于它的培训课程和写这本书的大约两年时间里,我得到了大量帮助。在我所有帮助的来源中,有两个特别重要。 第一个是Mark Rodgers。当我建立它们时,Mark慷慨地自愿检查我的培训材料,而且我从他那里比从其他人那里学到更多关于STL的东西。他也作为本书的技术评论家,再次提供改进了几乎每个条款的观点和见解。

另一个突出的信息源是几个有关C++的Usenet新闻组,特别是comp.lang.c++.moderated(“clcm”),comp.std.c++和microsoft.public.vc.stl。十多年来,我已经依赖于像这样的新闻组中的参加者来回答我的问题和挑战我的思想,而且很难想象如果没有他们我该怎么办。我非常感谢Usenet社区对本书和我早先关于C++的出版物的帮助。

多种出版物形成了我对STL的理解,其中最重要的列在了参考书目里。我对Josuttis的《The C++ Standard Library》[3]倾向特别大。

本书基本上是其他人做的一些见解和观点的摘要,虽然有一些想法是我自己的。我已经努力跟踪我在哪里学到了什么,但这个任务是没希望的,因为一个典型的条款包含在很长时间内从很多来源收集的信息。所以跟踪是不完全的,但是我已经尽力了。请注意在这里我的目标是总结一个想法或技术我第一次是在哪里学到的,而不是一个想法或技术最先在哪里开发或谁先想到了它。

在条款1,我的基于节点的容器对事务性语义提供了更好的支持的观点是基于Josuttis的《The C++ Standard Library》第5.11.2节[3]。条款2包括一个来自Mark Rodgers的关于当分配器类型改变之后typedef起了什么作用的例子。条款5由Reeves的《C++ Report》专栏《STL Gotchas》[17]激发而来。条款8源自Sutter的《Exceptional C++》[8]的条款37,而Kevlin Henney提供了关于auto_ptr的容器在实际中为什么失效的重要细节。在Usenet的帖子里,Matt Austern提供了分配器什么时候很有用的例子,而我把他的例子包含在条款11。条款12基于SGI STL网站[21]上关于线程安全性的讨论。条款13关于引用计数在多线程环境下的性能影响的材料来自Sutter关于这个主题的文章[20]。条款15的主意来自Reeves的《C++ Report》专栏《Using Standard string in the Real World, Part 2》[18]。在条款16,Mark Rodgers提出了我演示的让C API直接把数据写入一个vector的技术。条款17包含的信息来自Siemel Naran和Cart Barron在Usenet的帖子。条款18是我从Sutter的《C++ Roport》专栏《When Is a Container Not a Container?》[12]偷来的。在条款20,Mark Rodgers捐献了把一个指针通过一个解引用仿函数转换成一个对象的主意,而Scott Lewandowski提出了我呈现的DereferenceLess版本。条款21源自Doug Harrison在microsoft.public.vc.stl的帖子,但我决定把那个条款的重点放在相等。条款22基于Sutter的《C++ Report》专栏《Standard Library News: sets and maps》[13];Matt Austern帮我了解了标准委员会的库问题#103的情况。条款23是从Austern的《C++ Report》文章《Why You Shouldn't Use set -- and What to Use Instead》[15]得到的灵感;David Smallberg为我的DataCompare实现做出了一个优雅的改进。我对Dinkumware的散列容器的描述基于Plauger的《C/C++ Users Journal》专栏《Hash Tables》[16]。Mark Rodgers并不同意条款26的全部建议,但那个条款的早先动机是他的有些容器的成员函数只接受iterator类型的实参的观点。我对条款29的处理来自和扩充自Matt Austern和James Kanze发起的Usenet讨论;我也受到Kreft和Langer的《C++ Report》文章《A Sophisticated Implementation of User-Defined Inserters and Extractors》[25]的影响。条款30是因为Josuttis的《The C++ Standard Library》[3]第5.4.2节的讨论。在条款31,Marco Dalla Gasperina捐献了使用nth_element计算中值的例子,而使用那个算法来寻找百分点直接来自Stroustrup的《The C++ Programming Language》[7]第18.7.1节。条款32受到Josuttis的《The C++ Standard Library》[3]第5.6.1节的材料影响。条款35源自Austern的《C++ Report》专栏《How to Do Case-Insensitive String Comparison》[11],而James Kanze和John Potter的clcm帖子帮我精炼了我对出现这个问题的理解。Stroustrup的copy_if实现,也就是我在条款36演示的,来自他的《The C++ Programming Language》[7]第18.6.1节。条款39受到Josuttis的出版物很大的推动,他在《The C++ Standard Library》[3]里写了“带状态的判定式”,在标准库问题#92,和他的《C++ Report》文章《Predicates vs. Function Objects》[14]。在我这里,我使用了他的例子并接受他提出的一个解决方案,虽然术语“纯函数”是我发明的。Matt Austern证实了我在条款41的关于属于mem_fun和mem_fun_ref的历史的猜想。条款42可以追溯到当我考虑违反那个方针时Mark Rodgers给我的一个演讲。Mark Rodgers也对条款44的观点负责,也就是搜索map和multimap时,非成员函数检查每个pair的两个组件,而成员函数的搜索只检查第一个(键)组件。条款45包含来自多个clcm贡献者的信息,包括John Potter、Marcin Kasperski、Pete Becker、Dennis Yelle和David Abrahams。David Smallberg提醒我在进行基于等价的搜索和对有序序列容器的计数上equal_range的效用。Andrei Alexandreseu帮我了解了我在条款50提到的“到引用的引用问题”的情况,而我从Mark Rodgers提供的Boost网站[22]上类似的例子模仿出这个问题的例子。

当然,附录A的材料归功于Matt Austern。我感谢他不仅允许我在本书里包含它,而且还把它改得比原来更好。

好的技术书需要彻底的出版前检查,而很幸运我受益于一群非同寻常的天才技术评论家的见解。Brian Kernighan和Cliff Green为部分草稿提供了早期意见,而手稿的完整版本由Doug Harrison、Brian Kernighan、Tim Johnson、Francis Glassborow、Andrei Alexandrescu、David Smallberg、Aaron Campbell、Jared Manning、Herb Sutter、Stephen Dewhurst、Matt Austern、Gillmer Derge、Aaron Moore、Thomas Becket、Victor Von,当然还有Mark Rodgers细察。Katrina Avery做了审稿。

准备一本书最富挑战性的部分之一是找到好的技术评论家。我感谢John Putter把我介绍给Jared Manning和Aaron Campbell。

Herb Sutter好心地同意作为我在微软的Visual Studio .NET beta版上有些STL测试程序编译、运行和报告方面的行为的代理,而Leor Zolman担任测试在本书里的所有代码的极为艰巨的工作。当然,剩余的任何错误都是我的过错,并非Herb或者Leor的。

Angelika Langer让我看到了STL函数对象一些方面的不明状态。有关函数对象,本书说的比可能的要少,但它所说的基本上保证是真的。至少我希望它是。

本书的这次印刷比早期印刷的好,因为我指出了下面这些眼尖的读者发现的问题:Jon Webb、Michael Hawkins、Derek Price、Jim Seheller、Carl Manaster、Herb Sutter、Albert Franklin、George King、Dave Miller、Harold Howe、John Fuller、Tim McCarthy、John Hershberger、Igor Mikolic-Torreira、Stephan Bergmann、Robert Allan Schwartz、John Potter、David Grigsby、Sanjay Pattni、Jesper Andersen、Jing Tao Wang、André Blavier、Dan Schmidt、Bradley White、Adam Petersen、Wayne Goertel和Gabriel Netterdag。我感谢他们的在改进《Effective STL》方面所提供的帮助。

我在Addison-Wesley的合作者包括John Wait(我的编辑,现在是高级VP),Alicia Carey和Susannah Buzard(他的助手n和n+1),John Fuller(产品协调员),Karin Hansen(封面设计者),Jason Jones(都是技术领袖,特别是关于Adobe喷薄而出的有魔力的软件),Marty Rabinowitz(他们的老板,但他也工作),以及Curt Johnson,Chanda Leary-Coutu和Robin Bruce(都是销售员,但仍然非常好)。

Abbi Staley总能把星期日的午餐变成令人愉快的体验。

虽然在这之前有六本书和一张CD,我的妻子,Nancy,用她常有的自制力容忍了我研究和写作的要求,而且当我最需要的时候能给我鼓励和支持。她从未忘记提醒我生活比C++和软件重要。

然后是我们的狗,Persephone。当我写这个的时候,正是她的第六个生日。今晚,她和Nancy和我将去Baskin-Robbins吃冰淇淋。 Persephone将享受香草。一铲,在一个杯子里。走咯。