




已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
STL(StandardTemplateLibrary),泛型编程(GenericProgramming),代码复用,第6章模板,6.1模板概述,6.2函数模板,6.3类模板,6.4标准模板库,若一个程序的功能是对某种特定的数据类型进行处理,则可以将所处理的数据类型说明为参数,以便在其他数据类型的情况下使用。,6.1模板概述(Templates),通过模板可以产生类或函数的集合,使它们操作不同的数据类型,从而避免需要为每一种数据类型产生一个单独的类或函数。,泛型编程(genericprogramming)模板用于表达逻辑结构相同,但具体数据元素类型不同的数据对象的通用行为。,6.1模板概述,模板是支持参数化程序设计的工具,实现参数的多态性将程序要处理的对象的类型参数化,使程序可以处理不同类型的对象;,C+提供两种模板机制:函数模板类模板,6.2函数模板,考虑求两参数之中大值函数:max(a,b)对a,b的不同类型,都有相同的处理形式:return(ab)?a:b;,用已有方法解决对不同数据类型处理:,(1)宏替换#definemax(a,b)(ab?a:b)问题避开类型检查,(2)重载问题需要许多重载版本,(3)使用函数模板,6.2函数模板,重载函数通常基于不同的数据类型实现类似操作;对不同数据类型的操作完全相同,用函数模板实现更为简洁方便;C+提供的函数模板可定义一个对任何类型变量进行操作的函数,从而大大增强了函数设计的通用性。,intmax(inta,intb);intmax(chara,charb);.Boxmax(Boxa,Boxb);,templateTmax(Ta,Tb)returnab?a:b;,return(ab)?a:b;,template,声明模板中使用的类型参数。形式:,6.2.1模板说明,类型形式参数的形式为:typenameT1,typenameT2,typenameTn或classT1,classT2,classTn,类型参数,templatetemplatetemplate,templateTmax(Ta,Tb)returnab?a:b;,template类型函数名(形式参数表)语句序列,函数模板定义由模板说明和函数定义组成。模板说明的类型参数必须在函数首部中至少出现一次函数参数表中也可以使用一般类型参数.templateTmax(Ta,intn),6.2.2函数模板定义,templateTmax(Ta,Tb)returnab?a:b;,#includetemplateTmax(Ta,Tb)returnab?a:b;voidmain()coutmax(3,5)ismax(3,5)endl;coutmax(y,e)ismax(y,e)endl;coutmax(9.3,0.5)ismax(9.3,0.5)b?a:b;,doublemax(doublea,doubleb)returnab?a:b;,编译器生成的模板函数,程序执行时匹配不同的版本,类型实参与类型形参必须严格匹配templateTmax(Ta,Tb)returnab?a:b;,6.2.3函数模板参数匹配,max(i1,i2);/maxmax(c1,c2);/maxmax(i,c);/errormax(f,d);/errormax(str1,str2);/charstr110,str210max(b1,b2);/Boxb1,b2;,模板类型不能提供类型的隐式转换,显式指定模板类型参数可以实现类型转换,max(3,a);max(f,d);,intmax(inta,intb)returnab?a:b;,寻找和使用最符合函数名和参数类型的函数;寻找一个函数模板,将其实例化产生一个匹配的模板函数,若找到则调用它;寻找可以通过类型转换进行参数匹配的函数;如果按以上步骤均未能找到匹配函数,则调用错误。如果调用有多于一个的匹配选择,则调用匹配出现二义性。,6.2.4重载函数模板,templateTMax(constTa,constTb)returnab?a:b;templateTMax(constTa,constTb,constTc)Tt;t=Max(a,b);returnMax(t,c);intMax(constinta,constcharb)returnab?a:b;voidmain()Max(9.3,0.5);Max(9,5,23);Max(a,b,c);Max(1,1);Max(“lelele”,”hahaha”);,例3重载函数模板示例,intMax(constinta,constcharb)returnab?a:b;,templateTMax(constTa,constTb,constTc)Tt;t=Max(a,b);returnMax(t,c);,templateTMax(constTa,constTb)returnab?a:b;,重载函数模板,用普通函数重载函数模板,函数模板练习,templatevoidSwap(Tfor(inti=1;iai)min=ai;returnmin;,编写一个对具有n个元素的数组a求最小值的程序,要求将求最小值的函数设计成函数模板。,函数模板作业,templatevoidSort(T*a,intsize)Ttemp;.,排序法的函数模板,voidSort(int*array,intsize);/SortvoidSort(double*array,intsize);/SortvoidSort(char*carray,intsize);/SortvoidSort(char*name,intsize);/SortvoidSort(string*name,intsize);/SortvoidSort(Box*boxes,intsize);/Sort,函数模板作业,1.用函数模板方式设计一个函数模板sort,采用插入排序方式对数据进行排序可对整数序列、字符序列进行排序。可对盒子数组、字符串数组进行排序。2.设计函数模板实现折半查找算法binSearch在大小为n的数组arr中查找值为Key的元素返回查找结果(找到为下标,没找到-1)intbinSearch(Tarr,intn,Tkey),模板,函数模板,类模板,对象,模板函数,模板类,类模板实际上是函数模板的推广。类模板用于实现类所需数据的类型参数化类模板主要用于数据存储(容器)类。类模板在表示数据结构如数组、表、图等显得特别重要,他们表示和算法不受所包含的元素类型的影响。,6.3类模板,类模板类型为T的数组数据,类定义int类型数组,类定义string类型数组,类定义Box类型数组,类定义Employee*类型数组,/安全整形数组classArraypublic:Array(ints);Array();int,templateclassArraypublic:Array(ints);Array();constT,例4一个数组类模板,数据成员是T类型指针,类模板由模板说明和类说明构成,template类声明,例如,templateclassTClasspublic:/TClass的成员函数private:TypeDateMember;/;,类属参数必须至少在类说明中出现一次,6.3.1类模板与模板类,类模板的声明与定义,templateclass类名/类说明;template返回类型类名类型名:成员函数1(形参表)/成员函数定义体。template返回类型类名类型名:成员函数n(形参表)/成员函数定义体,类模板的成员函数是函数模板,Array,templateArray:Array(ints)size=(s1)?s:1;element=newTsize;templateArray:Array()deleteelement;templateconstT,例4一个数组类模板,templateclassArraypublic:Array(ints);virtualArray();virtualconstT,#include#includeArray.hvoidmain()ArrayIntAry(5);for(inti=0;iDouAry(5);for(i=0;i5;i+)DouAry.set(i,(i+1)*0.35);coutDoubleArray:n;for(i=0;i5;i+)coutDouAry.get(i)t;coutendl;,例4一个数组类模板,classArraypublic:constint,classArraypublic:constdouble,使用类模板的方法(1).在程序开始或头文件中说明类模板的定义。(2).在适当的地方创建一个模板类的实例,即一个模板类定义,同时创建该模板类对象。(3).使用对象调用成员函数。其实参类型与模板类规定的类型一致。,6.3.1类模板与模板类,;,templateclass.;,函数的形式参数类型可以是类模板或类模板的引用,实参为该类模板实例化的模板类对象.当一个函数拥有类模板参数时,这个函数必定是函数模板.,6.3.2类模板作函数参数,templatevoidArray:operator=(constArray,一个用Array作参数的函数模板,6.3.2类模板作函数参数,注意:模板的声明和定义必须在同一文件中,否则产生连接错误!,一个类模板在类层次结构中既可以是基类也可以是派生类:类模板可以从模板类派生类模板可以从非模板类派生模板类可以从类模板派生非模板类可以从类模板派生,6.3.3类模板与继承,templateclassArraypublic:Array(ints);virtualArray();virtualT,从类模板Array派生一个安全数组类模板BoundArray,6.3.3类模板与继承,templateclassArray,templateclassBoundArray:publicArraypublic:BoundArray(intlow=0,intheight=1);T,从类模板Array派生一个安全数组类模板BoundArray,6.3.3类模板与继承,作业,1.编写并使用安全数组类模板BoundArray,要求:1)从数组类模板Array派生而来:2)包括对数组进行排序和查找的方法。3)重载、,BoundArray,BoundArray和BoundArray,作业,2。用类模板方式设计一个栈类stack,其中数据存储结构用动态数组实现,类中包含两个私有数据成员:T*s(存放栈元素)和top(栈顶元素下标),至少包含3个公有成员函数:push(元素入栈)、pop(元素出栈)和stackempty(判断栈是否为空),并建立一个整数栈,一个字符栈和学生栈测试模板。,链表-结构体1,structStuintnum;stringname;doublescore;Stu*next;Stu*Create();/创建链表voidAdd(Stu/删除链表,链表类2,classStu;classStuNodepublic:StuNode();StuNode();voidprint();staticStuNode*pHead;staticintcount;private:Stus;StuNode*pnext;,StuNode*Create();voidDelete();voidAdd(StuNode,链表类3,classStu;classStuNode/节点类public:StuNode();StuNode();voidprint()const;StuNode*nextNode()const;voidinsertAfter(StuNode,/链表类classStuListpublic:StuList();StuList();voidcreat();voiddelete();voidAdd(Stu,链表类模板4,templateclassNode/结点类模板public:Node*pNext;Tdata;Node(constT,链表类模板4,templateclassListpublic:List();List();voidAdd(Node,6.4标准模板库(STL)(StandardTemplateLibrary),STL包括:容器、迭代器、算法等,6.4.1容器(container),容器是存储数据的一种方式容器分类:顺序容器关联容器和容器适配器顺序容器:vector(矢量)、list(链表)、deque(双端队列)关联容器set(集合)、multiset、map(映射)、multimap容器举例:vector.cpp.set.cpp,6.4.2迭代器(iterator),迭代器类似于指针,用来访问容器中的单个数据项。迭代器由类iterator来表明。不同的迭代器必须用于不同的容器。迭代器分类:向前迭代器,双向迭代器,随机迭代器使用迭代器:数据访问与数据插入,6.4.3算法(algorithm),STL算法在数据集上进行操作,泛型算法不依赖于具体的容器。泛型算法分类为(1)不修改序列的操作find()、cout()、equal()、mismatch()和search()等。(2)修改序列的操作swap()、copy()、transform()、replace()、
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 会展城工装合同标准文本
- 2025签约歌手经纪合同范本
- 修建住房合同样本
- 专业分包单位合同样本
- 泰州市劳动合同书
- 全国购房合同样本
- 保密专项培训合同标准文本
- 产品oem合作合同标准文本
- 供暖改造合同样本
- 故事代替道理:《勇敢说出你的答案》
- 只分红不占股协议范本
- 2023年江苏保安员考试题库及答案
- 青少年毒品预防教育-小学版
- 【“三曹”诗歌风格差异研究7800字(论文)】
- 任务三 辅助出行的出行者信息系统
- 绿色中国智慧树知到课后章节答案2023年下华东理工大学
- ERCP术前知情同意书
- 建筑工程计量与计价高职PPT完整全套教学课件
- 看板管理-精益生产
- 菜鸟WMS(大宝)操作手册 (修复的)
- 葫芦岛兰家沟矿业有限公司(钼矿)矿山地质环境保护与土地复垦方案
评论
0/150
提交评论