现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

漫话泛型编程

2012-08-01 02:53 工业·编程 ⁄ 共 2610字 ⁄ 字号 暂无评论

    泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。泛型编程的代表作品STL是一种高效、泛型、可交互操作的软件组件。所谓泛型(Genericity),是指具有在多种数据类型上皆可操作的含意,与模板有些相似。STL巨大,而且可以扩充,它包含很多计算机基本算法和数据结构,而且将算法与数据结构完全分离,其中算法是泛型的,不与任何特定数据结构或对象类型系在一起。STL以迭代器 (Iterators)和容器(Containers)为基础,是一种泛型算法(Generic Algorithms)库,容器的存在使这些算法有东西可以操作。STL包含各种泛型算法(algorithms)、泛型指针(iterators)、泛型容器(containers)以及函数对象(function objects)。STL并非只是一些有用组件的集合,它是描述软件组件抽象需求条件的一个正规而有条理的架构。

    泛型的第一个好处是编译时的严格类型检查。这是集合框架最重要的特点。此外,泛型消除了绝大多数的类型转换。如果没有泛型,当你使用集合框架时,你不得不进行类型转换。

    关于泛型的理解可以总结下面的一句话,它是把数据类型作为一种参数传递进来。

    泛型编程(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++标准库的一部分而出现的。

【上篇】
【下篇】

给我留言

留言无头像?