使用C++标准模板类库的好处

ZDNet软件频道 时间:2002-09-11 作者:BUILDER.COM |  我要评论()
本文关键词:
STL可以极大地改变你的编程方式,让你的代码可重用性、健壮性都得以提高。如果你充分利用STL的强大功能,你可以使你的工作更加简单而有效。
传统上,C++是作为一种面向对象的编程设计语言,以至于我们有时忘了C++实际上是第一个实现现代意义上的基于类的编程语言。在我的第一篇文章中提到,基于类的编程方法是一种与具体对象的数据结构无关的算法描述方法。

标准模板类库(STL)是基于类的编程方法的工具之一,它用模板实现了一些算法和容器,利于提高代码的可重用性和可扩展性。STL是标准C++两大类库之一。

容器

容器指的是具有内存管理功能的数据结构。在STL中,有两种容器,即顺序容器和关联容器。顺序容器指的是诸如矢量、双端队列、列表之类的具有映射(Map)、多映射(multimap)、集合(set)、多集合(multiset)特点的容器。STL中其它的容器由基本数据结构,如slists、hash set、hash map,扩展开得到的。容器的一个特点是在编译时才确定对象。由于容器是由C++模板实现的,所以其对象可以属于任何类或者数据结构类型。如表A所示。

图 A

点击放大

 

让我们避开学术角度,通过与标准C、C++数据类型来认识为什么要使用容器。首先考虑数组,只有两种情况,要么你在编译时说明固定大小的数组,要么在运行时动态分配数组大小。除非刻意为之,否则你不能动态扩展数组大小。这样,你就需要有诸如malloc(C语言函数)或new(C++操作符)之类的大量额外开销。

使用STL矢量是解决这个问题的一个灵巧手段,它可以像数组那样方便定义,又可以灵活地动态改变大小。清单A给出了一个从标准输入设备获得数字并把它们打印到标准输出设备的例子。

迭代器

迭代器将算法和数据绑定在一起。容器主要完成对各种数据结构的内存分配和回收工作,而迭代器则提供对容器中不同数据类型的标准遍历方法。

列表可以通过双向链表来实现,而矢量可以像C语言中的数组那样使用――每一种数据结构的遍历方法互不相同。然而,通过迭代器的抽象,你可以通过一个统一的界面去遍历各种容器,无论它是一个数组、链表或者是一个二叉树。

迭代器是纯粹的抽象,任何实现对容器遍历的类都是迭代器。一共以下五种迭代器:

  • 输入迭代器
  • 输出迭代器
  • 前向迭代器
  • 双向迭代器
  • 随机访问迭代器

每一种容器都有一套迭代器。对矢量来说,实现随即访问的迭代器是很容易的,但这对有序二叉树来说可能就有问题,而仅仅能实现双向迭代器了。这样,每一种容器需要完成对它最合适的迭代器。图B给出了不同容器实现的相应迭代器。如果完整的实现了随即访问迭代器,那么其它的四种迭代器也就同样实现了。

图 B

迭代器分类

清单B中,你可以看出前向迭代器的常用方法是如何影响到设计的。我们在矢量中用前向迭代器去输出整数而没有使用随即访问迭代器。有时为了与C语言风格指针以及现存的C语言数据类型(如数组)迭代器兼容,需要迭代器后向遍历,这是需要特别小心。清单C举例说明了如何在现有数据类型上实现迭代器功能。


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134