(C++程序设计课件)第五章-模板.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《(C++程序设计课件)第五章-模板.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 程序设计 课件 第五 模板
- 资源描述:
-
1、2023-1-301 1 第五章第五章 模板模板2023-1-302 2int min(int a,int b)return a b?a:b;double min(double a,double b)return a b?a:b;需要为每一种数据类型需要为每一种数据类型定义一个定义一个min函数函数例:求两个数的最小值例:求两个数的最小值参数个数、参数个数、处理流程相处理流程相同同2023-1-303 3?min(?a,?b )return a b?a:b;函数参数类型或返函数参数类型或返回类型能否在函数回类型能否在函数定义时不明确指定,定义时不明确指定,当调用时根据实参当调用时根据实参再确定
2、?再确定?5.1 5.1 函数模板函数模板2023-1-304 4template Type min(Type a,Type b)return a b?a:b;5.1.1 5.1.1 函数模板定义:将函数参数类型或返回类型参数化函数模板定义:将函数参数类型或返回类型参数化关键字关键字template template 总是放在模总是放在模板的定义与声明的最前面;板的定义与声明的最前面;关键字后面是用逗号分隔的关键字后面是用逗号分隔的模板参数表,它用尖括号模板参数表,它用尖括号 括起来;括起来;每个模板类型参数由关键字每个模板类型参数由关键字classclass或或typenametypenam
3、e开头,参数开头,参数名是用户自定义的标识符。名是用户自定义的标识符。template Parm min(Parm a,Parm b)return a b?a:b;等同于等同于2023-1-305 5template Type min(Type a,Type b)return a b?a:b;void main()int ri=min(10,20);double rd=min(10.2,20.1);/int min(int,int);/double min(double,double);模板实例化模板实例化2023-1-306 6template T1 sum(T2 a,T3 b)T1 s;s
4、=a+b;return s;模板类型参数模板类型参数在模板定义中在模板定义中的使用方式和的使用方式和一般类型相同一般类型相同注意:注意:函数参数类型可以被函数参数类型可以被部分参数化,部分参数化,但模板但模板参数表不能为空参数表不能为空。2023-1-307 7例:求一数组中的最小值。例:求一数组中的最小值。int min(const int array 10 )int min_val=array0;for(int i=1;i10;i+)if(arrayimin_val)min_val=arrayi;return min_val;int min(const int array,int size
5、)int min_val=array0;for(int i=1;isize;i+)if(arrayimin_val)min_val=arrayi;return min_val;template Type min(const Type array,int size)Type min_val=array0;for(int i=1;isize;i+)if(arrayimin_val)min_val=arrayi;return min_val;2023-1-308 8注意:注意:模板参数可以是一个模板参数可以是一个模板类型参数模板类型参数,它代表了一种类型;,它代表了一种类型;也可以是一个也可以是一个
6、模板非类型参数模板非类型参数,模板非类型参数由一个普通的,模板非类型参数由一个普通的参数声明构成,它代表了一个常量表达式。参数声明构成,它代表了一个常量表达式。int min(const int(&r_array)10)int min_val=r_array0;for(int i=1;i 10;+i)if(r_arrayi min_val)min_val=r_arrayi;return min_val;template Type min(const Type(&r_array)size)Type min_val=r_array0;for(int i=1;i size;+i)if(r_array
7、i min_val)min_val=r_arrayi;return min_val;2023-1-309 9template Type min(const Type(&r_array)size);用用函数实参的类型函数实参的类型来决定模板实参的类型和值的过程被称为来决定模板实参的类型和值的过程被称为模板实参推演。(模板实参推演。(函数返回类型并不用于模板实参推演函数返回类型并不用于模板实参推演)void main()int ai =12,7,9,39,3;double ad 3=2.3,4.5,1.8;int i=min(ai);double d=min(ad);int a=min(ad);5
8、.1.2 5.1.2 函数模板实例化函数模板实例化/Type为为int,size为为5/Type为为double,size为为3/Type为为double,size为为32023-1-301010template T1 sum(T2 a,T3 b)T1 s;s=a+b;return s;char a=0;int i=1;char b=sum(a,i);char sum(char,int);?char c=sum (a,i);显式模显式模板实参,板实参,可省略可省略尾部模尾部模板实参板实参char d=sum (a,i);/省略省略T2,T32023-1-3011115.1.3 5.1.3 模板
9、编译模式模板编译模式我们把函数我们把函数模板定义放在哪里模板定义放在哪里?放在放在头文件头文件中,就好像对内联函数定义的做法一样,中,就好像对内联函数定义的做法一样,在使用函数模板实例的地方包含它们;在使用函数模板实例的地方包含它们;或者我们或者我们只在头文件中给出函数模板声明只在头文件中给出函数模板声明,而把模板,而把模板定义放在定义放在*.c.c中,就好像对非内联函数的做法一样。中,就好像对非内联函数的做法一样。C+C+支持两种模板编译模式:支持两种模板编译模式:包含模式包含模式和和分离模式分离模式。2023-1-301212包含编译模式:将整个模板定义放在头文件中。包含编译模式:将整个模
10、板定义放在头文件中。/model1.htemplate Type min(Type t1,Type t2)return t1 t2?t1:t2;/在使用模板实例之前包含模板定义在使用模板实例之前包含模板定义#include model1.hint i,j;double dobj=min(i,j);缺点:向用缺点:向用户暴露了模户暴露了模板实现细节板实现细节2023-1-301313分离编译模式:分离编译模式:函数模板的声明被放在头文件中,函数模板的声明被放在头文件中,实现放在实现放在*.c文件中。文件中。/model2.htemplate Type min(Type t1,Type t2);/
11、model2.Cexport template Type min(Type t1,Type t2)/user.C#include model2.hint i,j;double d=min(i,j);template 之前加上关键字之前加上关键字export 来来声明一个可导出的函数模板,声明一个可导出的函数模板,export 不需要出现在头文件的模板声明中不需要出现在头文件的模板声明中2023-1-301414例:定义一个队列类例:定义一个队列类class Queue public:Queue():front(0),back(0)Queue();int&remove();void add(co
12、nst int&);bool is_empty()const return front=0;private:QueueItem*front;QueueItem*back;class QueueItem public:QueueItem(const int&);private:int item;QueueItem*next;能否定义通用能否定义通用队列类:不限制队列类:不限制结点保存的结点保存的数据类型?数据类型?2023-1-3015155.2 5.2 类模板类模板template class QueueItem public:QueueItem(const Type&);private:Ty
13、pe item;QueueItem*next;将类定义中用到的数据类型或常量值参数化将类定义中用到的数据类型或常量值参数化2023-1-301616template class Queue public:Queue():front(0),back(0)Queue();Type&remove();void add(const Type&);bool is_empty()const return front=0;private:QueueItem*front;QueueItem*back;类模板实例类模板实例化化2023-1-301717注意:注意:函数模板实例化时,既可以提供显式模板实参,也可根
14、据函数函数模板实例化时,既可以提供显式模板实参,也可根据函数实参进行实例化;实参进行实例化;类模板无法根据上下文环境确定模板参数,所以类模板无法根据上下文环境确定模板参数,所以必须提供显式必须提供显式模板实参进行实例化模板实参进行实例化。Queue qi;Queue qs100;Queue *qp=new Queue;实例化后的类模板实例化后的类模板称为模板类,其使称为模板类,其使用方法与一般类相用方法与一般类相同同2023-1-301818类模板成员函数定义:在类模板定义之外类模板成员函数定义:在类模板定义之外template void Queue :add(const Type&val)Q
15、ueueItem*pt=new QueueItem(val);if(is_empty()front=back=pt;elseback-next=pt;back=pt;当类模板被实例化时,类模板的当类模板被实例化时,类模板的成员函数并不自动被实例化,只成员函数并不自动被实例化,只有当一个成员函数被程序用到函有当一个成员函数被程序用到函数调用或取地址时,它才被实例数调用或取地址时,它才被实例化。化。Queue qi;int a;qi.add(a);2023-1-301919类模板编译模式:类模板编译模式:包含编译模式:类模板定义和成员函数定义等都放在头文件中。包含编译模式:类模板定义和成员函数定义
16、等都放在头文件中。分离编译模式:类模板定义放在头文件中,成员函数等定义放在分离编译模式:类模板定义放在头文件中,成员函数等定义放在程序文本文件程序文本文件*.cpp.cpp中。中。/-Queue.h-export template class Queue .public:Type&remove();void add(const Type&);.;/-Queue.C-#include Queue.htemplate void Queue:add(const Type&val).template Type&Queue:remove().export关键字用作关键字用作类模板定义中类模板定义中202
17、3-1-3020205.3 STL5.3 STL(标准模板库:(标准模板库:Standard Template LibraryStandard Template Library)各种各样的各种各样的数据结构:数据结构:链表、堆栈、队列、向量链表、堆栈、队列、向量各种各样的操作:各种各样的操作:遍历、插入、删除、替换遍历、插入、删除、替换面向对象的最大好处:复用、复用、再复用面向对象的最大好处:复用、复用、再复用C+标准库标准库提供许多复用组件提供许多复用组件2023-1-302121STL包括三个主要组件:包括三个主要组件:容器容器(container):模板化的复杂数据类型;):模板化的复杂
18、数据类型;迭代器迭代器(iterator):用于迭代访问容器中的数据;):用于迭代访问容器中的数据;泛型算法泛型算法(gerneric algorithm):可应用在多种数据):可应用在多种数据 类型(包括容器类型或内置数据类型)上的公共操作。类型(包括容器类型或内置数据类型)上的公共操作。下面以下面以vector容器为例介绍容器、迭代器、泛型算法的使用容器为例介绍容器、迭代器、泛型算法的使用2023-1-3022225.3.1 5.3.1 顺序容器:顺序容器:vectorvector类模板类模板:模板参数表示所存储每个元素的数据类型:模板参数表示所存储每个元素的数据类型快速快速随机访问随机访
19、问任何元素任何元素在在尾部快速插入、删除尾部快速插入、删除元素,在其它位置插入、删除元素效率很低元素,在其它位置插入、删除元素效率很低动态增长动态增长:存储空间的申请和释放由:存储空间的申请和释放由vectorvector类负责类负责vectorvector类表示具有连续内存单元的数据结构类表示具有连续内存单元的数据结构:顺序容器:由顺序容器:由单一类型元素单一类型元素组成、组成、顺序存放顺序存放的一个集合:的一个集合:vector、list、deque2023-1-302323为了定义为了定义vector对象,必须包含库头文件:对象,必须包含库头文件:#include using names
20、pace std;容器对象的定义以容器类型的名字开始,后面是所包含的容器对象的定义以容器类型的名字开始,后面是所包含的元素的实际类型,例如:元素的实际类型,例如:vector ivec;vector svec;可以是各种可以是各种内置数据类内置数据类型或用户自型或用户自定义类定义类初始为空:初始为空:长度为长度为0用户自定义类必须支持以下操作:用户自定义类必须支持以下操作:元素类型必须支持等于操作符元素类型必须支持等于操作符元素类型必须支持小于操作符元素类型必须支持小于操作符元素类型必须支持拷贝构造函数元素类型必须支持拷贝构造函数2023-1-302424插入元素最简单的方法是插入元素最简单的
21、方法是push_back(),将元素插入在容,将元素插入在容器的尾部:器的尾部:vector svec;string text_word;while(cin text_word)svec.push_back(text_word);cout svec.size()endl;长度动态增长长度动态增长vector支持其它一支持其它一些操作:些操作:比较操作比较操作指定位置或范围的指定位置或范围的插入、删除操作插入、删除操作2023-1-302525迭代器:迭代器:指向容器中的元素指向容器中的元素,用于对顺序或关联容器,用于对顺序或关联容器类型中的每个元素类型中的每个元素进行连续访问进行连续访问。5.
22、3.2 5.3.2 迭代器(迭代器(iteratoriterator)预定义迭代器预定义迭代器+方向方向功能功能iterator向前向前读读/写写const_iterator向前向前读读reverse_iterator向后向后读读/写写const_reverse_iterator向后向后读读vector中定义的迭代器:中定义的迭代器:vector:iteratorvector:iterator2023-1-302626vector vec;vector:iterator iter=vec.begin();vector:iterator iter_end=vec.end();for(;iter!
展开阅读全文