C++完全参考手册第四版中文版

bibofun 2007-06-05 12:42:48
本人E文不好,而且是C++初学者,想翻译《C++:The Complete Reference Fourth Edition》可以说是不可能的事(悄悄说声:这可能也是不合法的事,作者Herbert Schildt也可能极力反对)。不过由于这本书确实有它的参考价值,我相信中国学习C++的朋友和E文不好的朋友都希望能看到这本书的中文版,而且是FREE的。如果辛苦我一人,即使花上一、二年的时间,能够为中国学习C++的朋友提供一本中文版的《C++完全参考手册》,我觉得是莫大的荣幸。
单独凭我一人是不够的,我对C++了解不好,我对一些C++的术语还不清楚,不过我想借助各位热心的C++朋友之力,一起努力,把它translate into Chinese。
以下是我翻译的《完》的“第24章:标准模板库介绍”的一部分。因为是第一次翻译,所以很多地方翻译得不好,请朋友支持指正。你的热心将使中国的很多C++朋友受益!

我将把我的翻译陆续贴上来,同时更正朋友们所指出的错误,我也把它们发到我的百度博客http://hi.baidu.com/bibofun/,各位朋友有空去踩踩。
我手上的英文版的《完》是清华大学出版社出版的影印版。
以下是P629-P633的内容。
第24章 标准模板库介绍
Chapter 24 Introducing the Standard Template Library
这一章介绍标准模板库-许多人认为这是最近几年被添加到C++的最重要特性。加入STL(standard template library)是C++标准过程中的一个重要举措。STL提供了普遍目的、模板化了的类和函数,这些类和函数实现了很多普遍和常见的算法和数据结构,例如包含了对向量、表、队列和堆栈的支持。STL由模板类构造,所以算法和数据结构几乎能应用到任何一种数据类型。
STL是一项使用C++最多变特性的软件工程,为了理解和使用STL,你必须完全明白C++语言,包括指针,引用和模板。坦白地说,描述STL的模板语法看起来相当可怕,它看起来比实际用起来复杂得多。这一节是本书最难的部分,所以当你一开始就发现看STL很迷惑时不用感到惊讶或失意。耐心研究例子,不要让不熟悉的STL语法掩盖了原本简单的STL。
本章的目的是显现STL的概况,包括它的设计体系、组织、成分和使用它的编程技术。由于STL是一个大库,这里无法详细讨论它的各种特性。不过,第四部分提供有STL的完全参考。
这一章同时也讨论了C++最重要的类:string。string类定义了一种使用字符串的字符串数据类型,就像你使用其它数据类型一样:使用运算符。string类与STL联系很紧密。
STL综述
尽管标准模板库很大并且它的语法可能很可怕,一旦你明白了它的构造和使用它所引进的元素,STL实际上很简单。然而,在看任何例子代码之前,综述一下STL还是有必要的。
标准模板库的核心是三个基础项:容器(containers)、算法(algorithms)和迭代器(iterators),这些项结合在一起提供能解决不同编程问题的现成解决方案。
容器
容器(containers)是容纳其它对象的对象,并且有几种不同类型。例如,vector类定义了一种动态数组,deque创建了一种双端队列,而list提供了一个线性表。这些容器被叫做序列容器(sequence containers),因为在STL术语中,序列是一个线性表。除基本容器外,STL同时也定义了联合容器(associative containers),这些容器允许通过关键字获取值。例如,map提供了通过唯一键存取值的方法,这样,一个存取“键-值”对的map就可以通过使用 “键”来取回值。
每个容器类定义了一组可能应用到该容器的函数集合。例如,list包括了插入、删除和合并元素等函数,stack则包括了压入和弹出元素等函数。
算法
算法基于容器起作用。它们提供了操作容器内容的方法。它们有初始化、排序、搜索和转换容器内容的能力。很多算法在操作容器内一定范围内的元素。
迭代器
迭代器是行为对象,一定程度上像指针。就像指针遍历数组一种,它给了你遍历容器内容的能力。有五种类型的迭代器
迭代器 允许的操作
随机 存值和取值。元素要可以随机访问。
双向 存值和取值。向前或向后移动。
向前 存值和取值。仅向前移动。
输入 取值但不存值。仅向前移动。
输出 存值但不取值。仅向前移动。
一般地,一个有较大访问能力的迭代器可以代替有较少访问能力的迭代器的地方。例如,向前迭代器可以代替输入迭代器。
迭代器就像指针一样运作。你可以自加或自减它们,也可以在它们前面加上*操作符。迭代器使用在各种容器中定义的iterator来声明类型。
STL同时也支持反向迭代器(reverse iterators)。反向迭代器只能是在序列中能反向移动的双向或随机迭代器。
因此,如果一个反向迭代器指在一个序列的末尾,自加后反向迭代器将指向序列的末尾的前一个元素。
当模板描述中提及迭代器变量类型时,本书将使用下面的术语:
术语 代表
BiIter 双向迭代器
ForIter 向前迭代器
InIter 输入迭代器
OutIter 输出迭代器
RandIter 随机访问迭代器
其它STL元素
除了容器、算法和迭代器之外,STL还依赖于其它几种标准组件的支持。这些组件中最主要是分配器、断言、比较函数和函数对象。
每个容器都有定义了一个分配器(allocator)。分配器为容器管理内存分配。默认分配器是类allocator的一个对象,不过如果需要,你可以为特定的应用程序定义你自己的分配器。对于大多数应用,默认分配器已经足够了。
不少算法和容器使用一种叫断言(predicate)的特殊类型函数。一共有两种断言变量:一元的(unary)和二元的(binary)。一元断言带有一个参数,而二元断言带有二个参数。这些函数返回true/false。但返回true或false的精确条件是由你定义的。在本章的剩余部分,当需要一元断言函数时,将用符号UnPred表示。而二元断言函数则用符号BinPred。在二元断言函数中,参数总是以first,second的顺序出现。不管是一元还是二元断言,参数包含了保存在容器的对象类型的值。
一些算法和类使用一种特殊类型的二元断言,这种断言比较两个元素。如果第一个参数比第二个参数小,比较函数返回true。比较函数用符号Comp标示。
除了不同的STL类需要的头文件外,C++标准库包含了支持STL的头文件<utility>和<functional>。例如,能同时容纳一对值的模板类pair是在<utility>中定义的。我们将在这一章后面使用pair。
<functional>中的模板能构建定义了operator()的对象。这些对象叫函数对象(function objects),在很多时候它们可以代替函数指针。它们是:
plus minus multiplies divides modulus
negate equal_to not_equal_to greater greater_equal
less less_equal logical_and logical_or logical_not
可能用得最广泛的函数对象是用来确定一个对象比另一个对象小的less。函数对象在稍候将讨论STL算法中可以用来代替实际的函数指针。与使用函数指针相比,使用函数对象更能使STL产生高效的代码。
另外两个构成STL的实体是联编(binders)和倒换(negators),联编把一个函数对象绑定到一个参数上,倒换则返回一个断言的补码。
最后一个要知道的术语是适配器adaptor,在STL术语中,适配器把一种东西转换成另一种。比如,容器queue(创建了一个标准队列)是deque容器的适配器。
容器类
就如前面说的,容器是STL对象实际储存数据的地方。由STL定义的容器如表24-1所示。同时也显示了每个容器所需要的头文件。管理字符串的类string也是一个容器,不过它将在本章后面介绍。
容器 描述 所需要的头文件
bitset 位的集合 <bitset>
deque 双端队列 <deque>
list 线性表 <list
map 储存“键-值”对,每个键和一个值相关联 <map>
multimap 储存“键-值”对,每个键可以和两个或更多个值关联 <map>
multiset 每个元素不必都是独一的集合 <set>
priority_queue 优先队列 <queue>
queue 队列 <queue>
set 每个元素都是独一的集合 <set>
stack 堆栈 <stack>
vector 动态数组 <vector>
表24-1 由STL定义的容器



...全文
1025 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2007-06-05
  • 打赏
  • 举报
回复
虽然很打击你的热情,不过,现在C++好书已经是太多了,再增加可选好书只会令新手更痛苦。
如果你C++水平达到中等程度后,再翻译比较好,可以一下子令你进入高手行列。
jxpeter 2007-06-05
  • 打赏
  • 举报
回复
楼主属于热心人,支持~~~~~(你的博客我也收藏了,^_^)
bibofun 2007-06-05
  • 打赏
  • 举报
回复
有兴趣请直接到我的csdn上博客去看看。地址为http://blog.csdn.net/bibofun
bibofun 2007-06-05
  • 打赏
  • 举报
回复
我发表后发现baidu的blog不能保存太长的内容,所以把《完》发到了http://blog.csdn.net/bibofun/上去了。

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧