C++ 程序员的 STL

作者:Leen Ammeraal
出版社:John Wiley
价格:$49.99
ISBN: 0-471-97181-2
评论员:Bob Adkins
好消息——STL,标准模板库,在 Linux 上依然健壮且运行良好。Leen Ammeraal 在 C++ 程序员的 STL 中展示了这一点,以及他作为大师级教师的卓越技能。尽管主要重点不是 Linux,但他许多出色的示例可以轻松地适应 Linux 2.0++ 中的 g++ 环境(他为 Linux 调整的示例可以在 http://www.cwareco.com/download.html 找到)。Ammeraal 对使用 STL 的各个方面都进行了简洁而透彻的解释。
STL 起源于 1970 年代 Alexander Stepanov 关于设计通用算法的想法。Stepanov 与 Meng Lee 一起将这些想法带到 HP,并开发了第一个基于 C++ 的 STL。到 1994 年,STL 被 ANSI/ISO C++ 标准委员会接受纳入 C++ 草案标准。
STL 将通用算法与普通抽象数据类型封装的更专业的数据和方法区分开来。通过这种方式,复杂而强大的算法可以独立于应用它们的数据来实现,从而实现这些算法的通用化和重用。在 STL 中,更常见的对象抽象被保留用于数据和方法。然后,这些数据和方法根据其底层容器类型(如序列容器和关联容器)的特性进行定制和绑定。关于序列容器(如 vector 对象)的这种区别的例子是 begin、end 和 insert。这些方法访问和操作 vector 容器类的底层数据。然而,这些方法特定于数据的处理,不应与更通用的算法(如 find、sort 和其他高级数值算法(例如,accumulate 或 inner product))混淆。通用算法是一种方法抽象,与更传统的数据抽象形成对比。
自 GNU 的 libg++ 2.6.2 以来,Linux 上已提供 STL 支持。现在随着 2.7.2.1 版本的发布,该库对于大多数主要功能都非常可用,但命名空间作用域除外。与其他实现(例如 Borland 的 BC5 环境)存在细微差异,但这些差异主要涉及头文件命名约定。 fstream 也存在一个奇怪的问题,它涉及意外的文件访问模式默认值。
g++ 2.8.0 将提供更完整的 STL,它基于 SGI 的新代码和编译器模板实现的完全重新设计。遗憾的是,g++ 2.8.0 预计不会修复使用命名空间的问题。
从一开始,Leen Ammeraal 就为 STL 初学者提供了一个快速而实用的入门。然后,他解释了如何使用序列容器(vector、list 和 deque)、关联容器(set 和 map),并在稍后检查了从这些基本类型派生的容器,例如 stack、queue 和 priority queue。作为一个简单的应用程序,他展示了如何使用关联 map 容器构建电话目录。后来,他演示了一个更复杂的 map 应用程序,称为 concordance,它可以生成文本文件中所有单词的面向行的索引。他还展示了可用于在容器元素之间构建自定义排序关系的功能对象。他继续介绍算法以及 STL 的通用算法在操作序列和排序方面的实际细节。他演示了内置的数值算法,这些算法使 STL 在实现统计分析(如最小二乘法)方面具有吸引力。
在他的最后一章中,Ammeraal 提出了一个非常有趣的“超大数”示例。在这里,Ammeraal 使用 STL 计算 pi 到任意大的位数。Ammeraal 利用 STL 的强大功能来降低定义和操作极大数的实现复杂性。他指出,由于 STL 的 vector 容器,这个版本比他在他的书 C++ 算法与数据结构 中提出的早期解决方案“更简单、更优雅”。
为了增加趣味性,我修改了他的程序,以生成为 pi 计算的数字的直方图。在 100,000 位数中,数字“1”略占优势。此外,通过这个例子,Linux 展示了它的实力。在开启 g++ 完全优化后,我能够在不到 20 分钟的时间内计算出这 100,000 位数字。Ammeraal 指出,在 DOS/Windows 下,使用 BC5 进行相同的计算需要几个小时。
