泛型编程与STL

57 篇文章 1 订阅

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

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

1)引言                                                     

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

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

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

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

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

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

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

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

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

2)泛型编程与STL

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

1)泛型编程

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

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

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

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

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

2STL

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

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

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

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

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

3)历史

泛型程序最早出现1970年代的CLUAda语言中,后来被许多基于对象和面向对象的语言所采用,包括BETAC++DEiffel等。1993C++3.0版中引入的模版技术就属于泛型编程,19947ANSI/ISO C++标准委员会通过的STL更是泛型编程的集大成者,它已被纳入19989月的C++标准之中。Java20049月在J2SE 5.0JDK 1.5)中开始使用泛型技术;C# 2.0Visual Basic .NET 2005也于200511月采用了在微软.NET框架2.0版中所引入的泛型方法。

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

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

<!--[if !vml]-->199311月,受贝尔实验室的Andrew Koening的邀请,StepanovANSI/ISO C++标准委员会的会议上,介绍了泛型编程的理论和他们的工作。StepanovMeng Lee按委员会的要求,于19943月提出了STL的草案。委员会提出了一些修改意见,其中最重要的是对关联容器的扩充,由Musser完成了扩充部分的实现工作。19947月,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/ )。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值