第13讲模板与泛型编程_第1页
第13讲模板与泛型编程_第2页
第13讲模板与泛型编程_第3页
第13讲模板与泛型编程_第4页
第13讲模板与泛型编程_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机学院 计算机网络与信息安全研究室 张荣博 Shenyang Aerospace University1第第9 9章章 模板与泛型编程模板与泛型编程9.1 模板概念模板概念()()9.2 函数模板函数模板9.3 类模板类模板9.4 泛型编程泛型编程 ()()Shenyang Aerospace University2教学目标 了解泛型编程的概念及形式。了解泛型编程的概念及形式。重点及难点 重点:类模板及函数模版的定义。重点:类模板及函数模版的定义。 难点:模板的应用。难点:模板的应用。Shenyang Aerospace University3模板的概念模板的概念C+中常见的问题中常见的问

2、题void swap(int &a , int &b) int tmp = 0; tmp = a; a = b; b = tmp;/交换两个浮点数交换两个浮点数void swap(float &a , float &b) float tmp = 0.0; tmp = a; a = b; b = tmp;int main() int a = 10, b=20; float c = 1.2, d=2.4; cout “ a= “ a “ b= ”b; cout “ c= “ c “ d= ”c;swap(a,b);cout “ a= “ a “ b= ”b; swa

3、p(c,d);cout “ c= “ c “ d= ”c;return 0;Shenyang Aerospace University4提出问题提出问题q在在上面例子中,两个上面例子中,两个swap函数实现的函数实现的功能相同功能相同,只是只是参数类型不同参数类型不同,为了实现不同类型的数据交,为了实现不同类型的数据交换必须重新编辑函数。造成了重复劳动。换必须重新编辑函数。造成了重复劳动。q面向对象程序设计方法出现的目的之一是实现软面向对象程序设计方法出现的目的之一是实现软件重用,能否提供一种方法件重用,能否提供一种方法将两个函数合并到一将两个函数合并到一起起,以节省开发成本?,以节省开发成本

4、?Shenyang Aerospace University5解决方法解决方法typedef int DataType;void swap(DataType &a, DataType &b)DataType tmp ;tmp = a;a = b;b = tmp;int main() int a = 10, b=20; swap(a,b);return 0;Shenyang Aerospace University6分析问题分析问题v当需要交换两个浮点数时可以将DataType 定义成float 型数据即可。v缺点: 更改一种数据类型时,需要修改程序源代码,必须重新编译程序。v无

5、法解决的问题: 如果程序中需要交换多种数据类型之间的数据该怎么办?Shenyang Aerospace University7typedef int DataType;void swap(DataType &a, DataType &b)DataType tmp ;tmp = a;a = b;b = tmp;int main() int a = 10, b=20; float c = 1.2, d=2.4; swap(a,b); swap(c,d); return 0;v能否将能否将swapswap函数的形式参数,作为一种无类型的参数,当使用它函数的形式参数,作为一种无类型的参

6、数,当使用它的时候再将它用具体的参数实现?就像采用滞后捆绑实现多态一样!的时候再将它用具体的参数实现?就像采用滞后捆绑实现多态一样!Shenyang Aerospace University8模板的定义 模板模板本质上就是参数化多态,本质上就是参数化多态,是一种使用是一种使用无无类型参数类型参数来产生一系列函数或类的机制,是来产生一系列函数或类的机制,是C+的一个重要特性。的一个重要特性。 模板可以分为两类:模板可以分为两类:函数模板函数模板类模板类模板Shenyang Aerospace University9函数模板与模板函数 函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进

7、一步简化重载函数的函数体设计。 声明方法: template /模板声明模板声明 T max (T x, T y) /定义函数模板定义函数模板 return (xy)? x:y; Shenyang Aerospace University10模板函数qmax代表的是一类函数,是函数的集合;代表的是一类函数,是函数的集合;q要用要用max进行真正的操作前,先要将模板参数进行真正的操作前,先要将模板参数T实实例化为一般的类型(如例化为一般的类型(如 int 等);等);q max是一个函数模板,将是一个函数模板,将T实例化的参数称为实例化的参数称为模板模板实参实参,用模板实参实例化的函数称为,用模

8、板实参实例化的函数称为模板函数模板函数。 template /模板声明模板声明T max (T x, T y) return (xy)? x : y; Shenyang Aerospace University11例题#includeusing namespace std;template T max (T x, T y) return (xy)? x:y;void main() int i=10,j=56;float x1=50.34f,x2=56.34f;double y1=673.36,y2=465.972;coutThe max of i,j is:max(i,j)endl;coutT

9、he max of x1,y1 is:max(x1,x2)endl;coutThe max of x2,y2 is:max(y1,y2)endl;Shenyang Aerospace University12coutThe max of i,j is: max(i,j) endl; 当编译器遇到当编译器遇到max(i,j)时,生成函数名时,生成函数名max(int ,int ) : 用模板实参用模板实参int将类型参数将类型参数T进行了实例化。进行了实例化。coutThe max of x1,y1 is: max(x1,x2) endl; 当编译器遇到当编译器遇到max(x1,x2)时,生成函

10、数名时,生成函数名max(float ,float ) : 用模用模板实参板实参float将类型参数将类型参数T进行了实例化。进行了实例化。coutThe max of x2,y2 is: max(y1,y2) endl; 当编译器遇到当编译器遇到max(y1,y2)时,生成函数名时,生成函数名max(double, double) : max(y1,y2)用模板实参用模板实参double将类型参数将类型参数T进行了实例化进行了实例化Shenyang Aerospace University13 因此因此,上例中上例中max函数可以用函数可以用显式模板类型显式模板类型的方法写成下面的方法写成下

11、面的形势:的形势:void main()int i=10,j=56;float x1=50.34f,x2=56.34f;double y1=673.36,y2=465.972;coutThe max of i,j is:“ max(i,j)endl;coutThe max of x1,y1 is:“ max(x1,x2)endl;coutThe max of x2,y2 is:“ max(y1,y2)endl;Shenyang Aerospace University14模板参数表模板参数表: 是由若干个模板参数组成的。各参数间用是由若干个模板参数组成的。各参数间用逗号逗号隔隔开,每个模板参数

12、均是由开,每个模板参数均是由类型参数类型参数和和参数说明参数说明两部分,而两部分,而类类型参数指的是型参数指的是class标识符标识符。例如:例如: template /模板声明模板声明 T1 fun (T2 x, T3 y) . 多个不定参数的模板函数的定义多个不定参数的模板函数的定义Shenyang Aerospace University15注意注意:一般用:一般用T作为模板参数标识符,作为模板参数标识符,T代表任意类型。但实代表任意类型。但实质上用任何字母都可以质上用任何字母都可以:如:如:template 或或template 。 函数模板小结Shenyang Aerospace U

13、niversity16类模板与模板类的概念类模板与模板类的概念 类模板类模板:一个类模板允许用户为类定义一:一个类模板允许用户为类定义一种模式,使得类中的种模式,使得类中的某些数据成员某些数据成员、某些某些成员函数的参数成员函数的参数、某些成员函数的返回值某些成员函数的返回值,能取任意类型。它的存在不代表一个具体能取任意类型。它的存在不代表一个具体的、实际的类,而是代表一类的类,是类的、实际的类,而是代表一类的类,是类的集合。的集合。Shenyang Aerospace University17 类模板的定义类模板的定义template /声明一个类模板声明一个类模板class classna

14、me int No; T value; public: T GetValue() return value; void SetValue( T &v)value = v; ;Shenyang Aerospace University18 在类定义体外定义成员函数时,若此成员函数中有模板参在类定义体外定义成员函数时,若此成员函数中有模板参数存在,则需在函数体外进行模板声明,并且在函数名前数存在,则需在函数体外进行模板声明,并且在函数名前的类名后缀上的类名后缀上”。 template void classname :SetValue(T &v) vulae = v;template

15、 T classname :GetValue() return vulae;Shenyang Aerospace University19类模板的使用类模板的使用类模板的使用。类模板的使用实际上是将类模板类模板的使用。类模板的使用实际上是将类模板实例化成一个具体的类,它的格式为:实例化成一个具体的类,它的格式为:类名类名 对象名对象名;int main() classname obj;obj.SetValue(1.0); float tmp = obj.GetValue();Shenyang Aerospace University20/举例定义类举例定义类 #includeusing nam

16、espace std;template /声明模板声明模板class node /定义结构模板定义结构模板T val; /val取任意类型,即模板参数类型取任意类型,即模板参数类型node *next; /此处此处node为结构模板为结构模板;template /声明模板声明模板class list /定义类模板定义类模板node* head;/此处此处node为结构模板为结构模板int size;public:list() head=NULL;size=0;bool insert (T val); void print(); list();链表类模板的定义Shenyang Aerospace

17、 University21/定义成员函数定义成员函数,插入函数插入函数templatebool list:insert(T x) node* nodes=new node;if(nodes) nodes-val=x;nodes-next=head;head=nodes;size+;return true;return false; Shenyang Aerospace University22/定义成员函数定义成员函数 输出函数输出函数templatevoid list:print() for(node* p=head;p;p=p-next)coutval ;coutendl;/析构函数析构函

18、数template/声明模板声明模板list:list()/定义函数模板,其中定义函数模板,其中list为类模板为类模板node* temp; /node为结构模板为结构模板for(node* p=head;p;) temp=p; p=p-next; delete temp;Shenyang Aerospace University23/类模板的使用类模板的使用void main() /定义一个整型链表对象定义一个整型链表对象,此时传进来的模板参数为此时传进来的模板参数为list intlist;intlist.insert(34); intlist.insert(54);intlist.pr

19、int(); /定义一个浮点型链表对象定义一个浮点型链表对象,此时传进来的模板参数为此时传进来的模板参数为 list floatlist;floatlist.insert(34.56f); floatlist.insert(65.4f); floatlist.print(); /定义一个字符串型链表对象定义一个字符串型链表对象,此时传进来的模板参数为此时传进来的模板参数为list charlist;charlist.insert(windows); charlist.insert(object); charlist.print();54 3465.4 34.56object windowsSh

20、enyang Aerospace University24类模板总结类模板总结Shenyang Aerospace University25模板、类、对象、函数之间的关系模板、类、对象、函数之间的关系Shenyang Aerospace University26群体的概念群体是指由多个数据元素组成的集合体。群体可以分为两个大类:线性群体和非线性群体。线性群体中的元素按位置排列有序 (数组)。非线性群体不用位置顺序来标识元素(链表)。Shenyang Aerospace University27泛型编程q将程序写得尽可能通用; q将算法从特定的数据结构中抽象出来,成为通用的;qC+的模板为泛型程

21、序设计奠定了关键的基础; qSTL是泛型程序设计的一个范例 。容器(container) 迭代器(iterator) 算法(algorithms)函数对象(function object)Shenyang Aerospace University28容器容器类是容纳、包含一组元素或元素集合的对象。异类容器类与同类容器类顺序容器与关联容器七种基本容器: 向量(vector)、双端队列(deque)、列表(list)、 集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)Shenyang Aerospace University29容器的接口 通用容器运算符=

22、,!=,=,=,= 方法(函数)迭代方法( 指针的移动 )begin(),end(),rbegin(),rend()访问方法size(),max_size(),swap(),empty()Shenyang Aerospace University30适配器与迭代器q适配器是一种接口类(栈适配器)适配器是一种接口类(栈适配器)为已有的类提供新的接口。为已有的类提供新的接口。目的是简化、约束、使之安全、隐藏或者改变目的是简化、约束、使之安全、隐藏或者改变被修改类提供的服务集合。被修改类提供的服务集合。q迭代器是面向对象版本的指针,它们提供迭代器是面向对象版本的指针,它们提供了访问容器、序列中每个元

23、素的方法了访问容器、序列中每个元素的方法Shenyang Aerospace University31算法与函数对象qC+C+标准模板库中包括标准模板库中包括7070多个算法多个算法 其中包括查找算法,排序算法,消除算法,记其中包括查找算法,排序算法,消除算法,记数算法,比较算法,变换算法,置换算法和容数算法,比较算法,变换算法,置换算法和容器管理等等。器管理等等。q函数对象函数对象 一个行为类似函数的对象,它可以没有参数,一个行为类似函数的对象,它可以没有参数,也可以带有若干参数,其功能是获取一个值,或也可以带有若干参数,其功能是获取一个值,或者改变操作的状态。者改变操作的状态。Shenyang Aerospace University32顺序容器

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论