C STL编程轻松入门

2008-02-23 05:24:40来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

 作为C 标准不可缺少的一部分,STL应该是渗透在C 程式的角角落落里的。STL不是实验室里的宠儿,也不是程式员桌上的摆设,她的激动人心并非昙花一现。本教程旨在传播和普及STL的基础知识,若能借此机会为STL的推广做些力所能及的事情,到也是件让人愉快的事情。

  1 初识STL:解答一些疑问

  1.1 一个最关心的问题:什么是STL

  "什么是STL?",假如您对STL还知之甚少,那么我想,您一定很想知道这个问题的答案,坦率地讲,要指望用短短数言将这个问题阐述清楚,也决非易事。因此,假如您在看完本节之后还是觉得似懂非懂,大可不必着急,在阅读了后续内容之后,相信您对STL的认识,将会愈加清楚、准确和完整。但是,上述这番话听起来是否有点像是在为自己糟糕的表达能力开脱罪责呢?:)

  不知道您是否有过这样的经历。在您准备着手完成数据结构老师所布置的家庭作业时,或在您为您所负责的某个软件项目中添加一项新功能时,您发现需要用到一个链表(List)或是映射表(Map)之类的东西,但是手头并没有现成的代码。于是在您开始正式考虑程式功能之前,手工实现List或Map是不可避免的。于是……,最终您顺利完成了任务。或许此时,作为一个具备较高素养的程式员的您还不肯罢休(或是个喜欢偷懒的优等生:),因为您会想到,假如以后还碰到这样的情况怎么办?没有必要再做一遍同样的事情吧!

  假如说上述这种情形每天都在发生,或许有点夸张。但是,假如说整个软件领域里,数十年来确实都在为了一个目标而奋斗--可复用性(reusability),这看起来似乎并不夸张。从最早的面向过程的函数库,到面向对象的程式设计思想,到各种组件技术(如:COM、EJB),到设计模式(design pattern)等等。而STL也在做着类似的事情,同时在他背后蕴涵着一种新的程式设计思想--泛型化设计(generic programming)。

  继续上面提到的那个例子,假如您把List或map完好的保留了下来,正在暗自得意。且慢,假如下一回的List里放的不是浮点数而是整数呢?假如您所实现的Map在效率上总是令您不太满意并且有时还会出些bug呢?您该如何面对这些问题?使用STL是个不错的选择,确实如此,STL能够漂亮地解决上面提到的这些问题,尽管您还能够寻求其他方法。

  说了半天,到底STL是什么东西呢?

  STL(Standard Template Library),即标准模板库,是个具备工业强度的,高效的C 程式库。他被容纳于C 标准程式库(C Standard Library)中,是ANSI/ISO C 标准中最新的也是极具革命性的一部分。该库包含了诸多在电脑科学领域里所常用的基本数据结构和基本算法。为广大C 程式员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。这种现象有些类似于Microsoft Visual C 中的MFC(Microsoft Foundation Class Library),或是Borland C Builder中的VCL(Visual Component Library),对于此二者,大家一定不会陌生吧。

  从逻辑层次来看,在STL中体现了泛型化程式设计的思想(generic programming),引入了诸多新的名词,比如像需求(requirements),概念(concept),模型(model),容器(container),算法(algorithmn),迭代子(iterator)等。和OOP(object-oriented programming)中的多态(polymorphism)相同,泛型也是一种软件的复用技术。

  从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式实现的,这种方式基于一个在早先C 标准中没有出现的语言特性--模板(template)。假如查阅任何一个版本的STL源代码,您就会发现,模板作为构成整个STL的基石是一件千真万确的事情。除此之外,更有许多C 的新特性为STL的实现提供了方便。

  不知您对这里一下子冒出这么多术语做何感想,希望不会另您不愉快。假如您对他们之中的大多数不甚了解,敬请放心,在后续内容中将会对这些名词逐一论述。正如开头所提到的。

  有趣的是,对于STL更有另外一种解释--STepanov & Lee,前者是指Alexander Stepanov,STL的创始人;而后者是Meng Lee,她也是使STL得以推行的功臣,第一个STL成品就是他们合作完成的。这一提法源自1995年3月,Dr.Dobb's Journal特约记者, 著名技术书籍作家Al Stevens对Alexander Stepanov的一篇专访。

  1.2 追根溯源:STL的历史

  在结识新朋友的时候,大多数人总是忍不住想了解对方的过去。本节将带您简单回顾一下STL的过去。

  被誉为STL之父的Alexander Stepanov,出生于苏联莫斯科,早在20世纪70年代后半期,他便已开始考虑,在确保效率的前提下,将算法从诸多具体应用之中抽象出来的可能性,这便是后来泛型化思想的雏形。为了验证自己的思想,他和纽约州立大学教授Deepak Kapur,伦塞里尔技术学院教授David Musser一起研发了一种叫做Tecton的语言。尽管这次尝试最终没有取得实用性的成果,但却给了Stepanov很大的启示。

  在随后的几年中,他又和David Musser等人先后用Schema语言(一种Lisp语言的变种)和Ada语言建立了一些大型程式库。这其间,Alexander Stepanov开始意识到,在当时的面向对象程式设计思想中所存在的一些问题,比如抽象数据类型概念所存在的缺陷。Stepanov希望通过对软件领域中各组成部分的分类,逐渐形成一种软件设计的概念性框架。

  1987年左右,在贝尔实验室工作的Alexander Stepanov开始首次采用C 语言进行泛型软件库的研究。但遗憾的是,当时的C 语言还没有引入模板(template)的语法,现在我们能够清楚的看到,模板概念之于STL实现,是何等重要。是时使然,采用继承机制是别无选择的。尽管如此,Stepanov还是研发出了一个庞大的算法库。和此同时,在和Andrew Koenig(前ISO C 标准化委员会主席)和Bjarne Stroustrup(C 语言的创始人)等顶级大师们的共事过程中,Stepanov开始注意到C/C 语言在实现其泛型思想方面所具备的潜在优势。就拿C/C 中的指针而言,他的灵活和高效运用,使后来的STL在实现泛型化的同时更是保持了高效率。另外,在STL中占据极其重要地位的迭代子概念便是源自于C/C 中原生指针( native pointer)的抽象。

  1988年,Alexander Stepanov开始进入惠普的Palo Alto实验室工作,在随后的4年中,他从事的是有关磁盘驱动器方面的工作。直到1992年,由于参加并主持了实验室主任Bill Worley所建立的一个有关算法的研究项目,才使他重新回到了泛型化算法的研究工作上来。项目自建立之后,参和者从最初的8人逐渐减少,最后只剩下两个人--Stepanove本人和Meng Lee。经过长时间的努力,最终,信念和汗水所换来的是个包含有大量数据结构和算法部件的庞大运行库。这便是现在的STL的雏形(同时也是STL的一个实现版本--HP STL)。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 纵横捭阖C 之从异步谈起

下一篇: 理解C 程式设计中的抽象理论