全部博文(465)
分类: C/C++
2013-08-22 16:18:28
《Effective STL中文版》译序
就像本书的前两本姊妹作(Effective C++、More Effective C++)一样,本书的侧重点仍然在于提升读者的经验,只不过这次将焦点瞄准了C++标准库,而且是其中最有意思的一部分——STL。
C++是一门易学难用的编程语言,从学会使用C++到用好C++需要经过不断的实践。Scott Meyers 的这三本姊妹作分别从各个不同的角度来帮助你缩短这个过程。C++语言经过了近二十年的发展,已渐趋完善。尽管如此,在使用C++语言的时候,仍然有许多陷阱,有的陷阱非常明显,一经点拨就可以明白;而有的陷阱则不那么直截了当,需要仔细地分析才能揭开那层神秘的面纱。
本书是针对STL 的经验总结,书中列出了50 个条款,绝大多数条款都解释了在使用STL时应该注意的某一个方面的问题,并且详尽地分析了问题的来源、解决方案的优劣。这是作者在教学和实践过程中总结出来的经验,其中的内容值得我们学习和思考。
STL 的源码规模并不大,但是它蕴含的思想非常深刻。在C++标准化的过程中,STL 也被定格和统一。对于每一个STL 实现,我们所看到的被分为两部分:一是STL 的接口,这是应用程序赖以打交道的基础,也是我们所熟知的STL;二是STL 的实现,特别是一些内部的机理,有的机理是C++标准所规定的,但是有的却是实现者自主选择的。在软件设计领域中有一条普遍适用的规则是“接口与实现分离”,但是对于STL,你不能简单地使用这条规则。虽然你写出来的程序代码只跟STL 的接口打交道,但是用好STL 则需要建立在充分了解STL 实现的基础之上。你不仅需要了解对所有STL 实现都通用的知识,也要了解针对你所使用的STL 实现的特殊知识。那么,你该如何来把握接口与实现之间的关系呢?本书讲述了许多既涉及接口也关系到具体实现的STL 用法,通过对这些用法的讲解,读者可以更加清楚地了解应该如何来看待这些与实现相关的知识。
这两年来,有关STL 的书籍越来越多,而且许多C++书籍也开始更加关注于STL 这一部分内容。对于读者来说,这无疑是一件好事,因为STL 难学的问题终于解决了。我们可以看到,像vector 和string 等常用的STL 组件几乎出现在任何一个C++程序中。但是,随之而来的STL难用的问题却暴露出来了,程序员要想真正发挥STL 的强大优势并不容易。在现有的STL 书籍中,像本书这样指导读者用好STL 的书籍并不多见。
本书沿袭了作者一贯的写作风格,以条款的形式将各种使用STL 的经验组织在一起,书中主要包括以下内容:
如何选择容器的类型。STL 中容器的类型并不多,但是不同的容器有不同的特点,所以选择恰当的容器类型往往是解决问题的起点。本书中还特别介绍了与vector 和string两种容器有关的一些注意事项。
涉及关联容器有更多的陷阱,一不留神就可能陷入其中。作者专门指出了关联容器中一些并不直观的要点,还介绍了一种非标准的关联容器——散列容器。
迭代器是STL 中指针的泛化形式,也是程序员访问容器的重要途径。本书讨论了与const_iterator 和reverse_iterator 有关的一些问题。以我个人之见,本书这部分内容略显单薄,毕竟迭代器在STL 中是一个非常关键的组件。
STL 算法是体现STL 功能的地方,一个简单的算法调用或许完成了一件极为复杂的事情,但是要用好STL 中众多的算法并不容易,本书给出了一些重要的启示。
函数对象是STL 中用到的关键武器之一,它使得STL 中每一个算法都具有极强的扩展性,本书也特别讨论了涉及函数和函数对象的一些要点。
其他方方面面,包括在算法和同名成员函数之间如何进行区别、如何考虑程序的效率、如何保持程序的可读性、如何解读调试信息、关于移植性问题的考虑,等等。
本书并没有面面俱到地介绍所有要注意的事项,而只是挑选了一些有代表性的,也是最有普遍适用性的问题和例子作为讲解的内容。有些问题并没有完美的解决方案,但是,作者已经把这个问题为你分析透了,所以最终的解决途径还要取决于作为实践者的你。
本书的翻译工作是我和陈铭、邹开红合作完成的,其中邹开红完成了前25 条的初译工作,陈铭完成了后25 条的初译工作,最后我完成了所有内容的终稿工作,同时我也按照原作者给出的勘误作了修订。错误之处在所难免,请读者谅解。
对于每一个期望将STL 用得更好的人,这本书值得一读。
潘爱民
本文节选自《Effective STL中文版》一书
潘爱民 陈铭 邹开红 著
电子工业出版社出版