注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

ocean's blog

平常心——可以寂寞,但不允许空虚

 
 
 

日志

 
 

泛型编程与STL  

2009-06-09 22:05:30|  分类: C++(转) |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

泛型编程(generic programming通用编程/类属编程)和面向过程以及面向对象一起,是混合型程序设计语言C++所包含的三种编程风范(paradigm范例/范型)。

传统C++的泛型编程,仅仅局限于简单的模版技术。标准C++新引入了容器(container)、迭代器(iterator)、分配器(allocator)和STL(Standard Template Library标准模板库)等概念和内容,才真正进入泛型编程的广阔天地。

1)引言                                                     
面向过程的编程,可以将常用代码段封装在一个函数中,然后通过函数调用来达到目标代码重用的目的。面向对象的方法,则可以通过类的继承来实现(对象的目标)代码的重用。

如果需要编写一个可用于不同数据类型的算法,可以采用的方法有:

<!--[if !supportLists]-->l     <!--[endif]-->面向过程——对源代码进行复制和修改,生成不同数据类型版本的算法函数,调用时需要对数据类型进行手工的判断;

<!--[if !supportLists]-->l     <!--[endif]-->面向对象——可以在一个类中,编写多个同名函数,它们的算法一致,但是所处理数据的类型不同,当然函数的输入参数类型也不同,可通过函数重载来自动调用对应数据类型版本的函数。

显然,这两种方法都需编写了多个相同算法的不同函数,不能做到代码重用。它们二者之间的主要差别,只是调用的方便与否。

如果采用泛型编程(例如可采用以类型作为参数的传统C++的模板技术),就可以做到源代码级的重用:

<!--[if !supportLists]-->l     <!--[endif]-->泛型编程——编写以类型作为参数的一个模板函数,在调用时再将参数实例化为具体的数据类型。

(注意,模版的实例化,是在编译阶段完成的,属于静态性质的方法,与C/C++的宏替代方式非常相似,但是更为安全、更易理解、且更加有效。)

为了实现一个,在具有不同组织结构(如数组、链表、队列、堆栈等)、含同一类型(如char、int、float、struct S或class C等)的数据或对象的集合(容器)上的,与具体数据类型无关的参数化通用算法(如排序、检索、复制、合并等)。光有模版是远远不够的,还需要能够表示这种集合的容器、能够在容器中遍历的迭代器、能够为算法和容器实现抽象存储的分配器、能够在不同容器之间进行转换的适配器等等。这些正是泛型编程的研究内容,也是STL要实现的目标。

2)泛型编程与STL
泛型编程是一种面向算法的多态技术,STL是它的一种具体实现。

(1)泛型编程
在计算机科学中,泛型(generic)是一种允许一个值取不同数据类型(所谓多态)的技术,强调使用这种技术的编程风格被称为泛型编程(generic programming通用编程/类属编程)。

泛型编程研究对软件组件的系统化组织。目标是推出一种针对算法、数据结构和内存分配机制的分类方法,以及其他能够带来高度可重用性、模块化和可用性的软件工具。

与针对问题和数据的面向对象的方法不同,泛型编程中强调的是算法。是一类通用的参数化算法,它们对各种数据类型和各种数据结构都能以相同的方式进行工作,从而实现源代码级的软件重用。

例如,不管(容器)是数组、队列、链表、还是堆栈,不管里面的元素(类型)是字符、整数、浮点数、还是对象,都可以使用同样的(迭代器)方法来遍历容器内的所有元素、获取指定元素的值、添加或删除元素,从而实现排序、检索、复制、合并等各种操作和算法。

泛型编程的通用化算法,是建立在各种抽象化基础之上的:利用参数化模版来达到数据类型的抽象化、利用容器和迭代器来达到数据结构的抽象化、利用分配器和适配器来达到存储分配和界面接口的抽象化。

(2)STL
STL(Standard Template Library标准模板库)是泛型编程思想的实际体现和具体实现,它是一种为泛型组件建立大型标准库的可扩展架构。STL本身,与面向对象无关,也与具体的程序设计语言无关。

STL的目标是,在不损失效率的基础上,进行抽象。这里的不损失效率,是指尽最大努力来保证其所有的泛型算法是最优的,并且和手工编码具有同样的运行效率。抽象的基础是数学和冯·诺依曼计算模型(存储程序体系结构)。

如果用数学语言来描述,STL的本质就是:不同的数据结构,对应于不同的地址代数结构、以及不同的地址连接方式。从数据结构的一个地址,转向下一个地址的一些列操作,就对应于迭代器。在数据结构中添加和删除地址的操作,就对应于容器。

STL将容器看作是结构的泛化,它们都拥有成员,可以描述整体和局部这一现实世界事物的关键属性。STL使用了赋值的算法,要求采用面向值的语义。STL还假定对容器中的数据和对象,定义了全序。

STL的主要内容是6种组件:容器、泛型算法、迭代器、函数对象、分配器和适配器等。在标准C++中,STL是作为C++标准库的一部分而出现的。

(3)历史
泛型程序最早出现1970年代的CLU和Ada语言中,后来被许多基于对象和面向对象的语言所采用,包括BETA、C++、D和Eiffel等。1993年C++在3.0版中引入的模版技术就属于泛型编程,1994年7月ANSI/ISO C++标准委员会通过的STL更是泛型编程的集大成者,它已被纳入1998年9月的C++标准之中。Java于2004年9月在J2SE 5.0(JDK 1.5)中开始使用泛型技术;C# 2.0和Visual Basic .NET 2005也于2005年11月采用了在微软.NET框架2.0版中所引入的泛型方法。

1971年,Dave Musser首先提出并推广了泛型编程的理论,但是主要局限于软件开发和计算机代数领域。1979年,Alexander Stepanov开始研究泛型编程,认识到泛型编程的巨大潜力,提出了STL的体系结构。

Alexander Stepanov于1950年出生在苏联莫斯科,早在1979年他就开始研究泛型编程。1987年他与Dave Musser一道,开发出Ada的泛型表处理库。1990年前后,Stepanov先后 <!--[if !vml]--><!--[endif]-->在AT&T的贝尔实验室和HP的研究实验室,进行泛型编程的研究和库设计。

Alexander Stepanov
 
<!--[if !vml]-->1993年11月,受贝尔实验室的Andrew Koening 的邀请,Stepanov在ANSI/ISO C++标准委员会的会议上,介绍了泛型编程的理论和他们的工作。Stepanov和Meng Lee按委员会的要求,于1994年3月提出了STL的草案。委员会提出了一些修改意见,其中最重要的是对关联容器的扩充,由Musser完成了扩充部分的实现工作。1994年7月,ANSI/ISO C++标准委员会终于通过了修改后的STL方案。

1994年8月,HP将Stepanov和Lee等人开发的STL,在因特网上免费发布。1995年Stepanov又到SGI工作,他与Hans Boehm和Matthew H. Austern一起,为SGI开发了STL。SGI也把它免费地放在了因特网上(http://www.sgi.com/tech/stl/download.html),并提供了一个完整的在线说明文档(由Austern编写,参见网址:http://www.sgi.com/tech/stl/)。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/touzani/archive/2007/06/08/1643972.aspx

  评论这张
 
阅读(737)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017