版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六
模 inta,b,c;char //读入数
intmax(int,int,int){max(double,double,double){}char*max(char*,char*,char*){}通如何完成此要求 重 模模板:包括函数模板和类模板函数模板定义template<模板参数表>(形式参数表{……;//}intintmax(inta,intb,intdoublemax(doublex,doulbey,doublez):char*max(char*s1,char*s2,char*s3);template<typenametemplate<typenameTmax(Ta,Tb,Tc){模板——数据类型参数化,实现通用template<typenameT>Tmax(Ta[],intn){}模板的使用——(templateint double strings[20];…;inti=max(a,5);intj=max(d,10);intk=max(s,20);
template<typenameTmax(constT*array,intsize){inti;Tfor(i=1;i<size;++i)returnmax;}模板参数表的使用与函数形式参数表的使用相同,都是位置应。类型和值的置换过程称为模板实例化。形参size表示数组的长度intdoublestring intmain()inti=max(ia,5);//隐式显cout整数最大值为:"<<i<<endl;doubled=max(da,6);//隐式显示coutstrings=max(sa,5)//隐式显cout字典排序最大为:"<<s<<endl;return0; 函数模板与模板函数 例floatscore[3][4]={{65,67,70 ave1(floatp[][4],int{floatsum=0;inti,j;for(i=0;i<n;i++)for(j=0;j<4;j++)sum+=p[i][j];return}
floatx=ave1(score,3第一个形参是二维数组,第二个形参为二维数组的行数。对应的第一个实参为二维数组名score。例floatscore[3][4]={{65,67,70floatave2(float*p,int{floatsum=0;inti;for(i=0;i<n;i++)sum+=*p++;return
floatx=ave2(*score,12第一个参数是一级指针,它把二维数组作为一维数组来处理,第二个参数是二维数组中的元素个数。其对应的第一个实参应是第0行第0列元素的地址,即sore。}例floatscore[3][4]={{65,67,70 ave3(float(*p)[4],int{floatsum=0;inti,j;
floatx=ave3(&score[0],3for(i=0;i<n;i
第一个形参为指向一维数组的指针变量for(j=0;j<4;j++)sum+=(*p)[j];}
第二个形参为二即&score[0]。return}函数模板 template<typenameT1,typenamevoidinverse(T1*mat1,T2*mat2,inta,inttemplate<typenameT1,typenamevoidmulti(T1*mat1,T2*mat2,T2*result,intintb,inttemplate<typenamevoidoutput(T*mat,char*s,inta,int注意:mat2和result属同一类的一维数组所组成的二维数组记住数组最高维 查边界的intintmiddle[6][3],intintmatrix2[3][4]={3,2,1,0,-1,-charchar//显式:inverse<int[6],int[3//显式:multiint[3],int[4return}template<typenameT1,typenameT2>voidinverse(T1*mat1,T2*mat2,inta,intb){intforfor(j=0;j<a;j++)}
66 66
246246 template<typenameT1,typenameT2>void*mat1,T2*mat2,T2*result,inta,intb,intc){inti,j,k;
result[i][j]= 9221922144366
-1- template<typenameT>voidoutput(T*mat,char*s,inta,intb){inti,j;cout<<setw(4)<<mat[i][j]<<"";cout<<endl;}}类模板与线性template<模板参数表class类名……template<模板参数表>返回类型类名<>::成员函数名1(形参表……;//成员函数定义}template<模板参数表>返回类型类名<>::成员函数名n(形参表……;//成员函数n定义}6.1.2
模板非类型参数template<typenameT,intn>classArray{Ta[n模板应用(实例化Array<int,模板应用(实例化Array<int,100>Array<double,20>list2;Array(){size=n;}voidprint();...
常量模板类型参数template<typenameT,inti>voidArray<T,i>::print(){for(inti=0;i<size;i++)}#includeiostream//#include<cstdlib>usingnamespacestd;struct //结构体int //floatgpa;//template<classT>//classT //inthaveValue;//标记itemStore();//T em();//void em(Tx);//template<class
//构造函数,haveValue初值赋template<classT }returnitem;//返回item}template<classvoid em(T //将x值存入}intStudentg={1000,23};// Store<int>S1,S2;// Store<Student>S3;// Store<Student>类对象S3,其中数据成员item为Student类型Store<double>D;// Store<double>类对象D,其中数据成员item为double类型 em(3);//向对象S1中存入数据(初始化对象S1) em(-7);//向对象S2中存入数据(初始化对象 em em()<<endl;//S1和S2 em(g);//向对象S3中存入数据(初始化对象Student) cout<<"RetrievingobjectD"; //由于D未初始化,在执行函数 em()过程中导致程序终return}线性表对顺序表的典型操作包括:计算表长度,寻找变量或对象 的类型可以各不相同,所以定义为类模板6.1.2线性表的概念 元排静态数组是不可能续上10个的,必然产生溢出。因系统查表是否满下 58图 下 图图 从表中删除一个数 下 58图
x58下x58
图图 向表 一个数一般的成员函数可以本类中的非const数据成员,也可以修改它们。如果将成员函数为常成员函数,则只能本类中的数据成员,而不能修改它们。 Gettime( //注意const的位置在函数名和括号之 常成员函数的使 template<typenameT,intsize>classseqlist{Tslist[size]; intMaxsize; intlast; intLength()const {returnlast+1;} intFind(T&x)const; //寻找x位置(下标)const成员函数,该函数保证只读boolIsIn(T&x); //判断x是否在表中,形参为boolRemove(T& //删除boolInsert(T&x,int //在第i个位 intNext(T& //寻找xintPrior(T& //寻找xboolIsEmpty(){returnlast1;}//boolIsFull returnlastMaxsize-1//TGet(inti){//取第i个 值,带有下标检查功returni<0||i>last?NULL:}T&operator[](inti);//重载下标运算符template<typenameT,intsize>seqlist<T,size>::Find(T& 告,防止编程 intwhile(i<=last&&slist[i]!=xi++;//顺序查找是否有if(i>lastreturn-1;//未找到,返回-elsereturni;//找到,返回下}template<typenameT,intsize>seqlist<T,size>::IsIn(T&x){inti=0;boolwhile(i<=last&&!found)//换 法来查ifslist[i]!=xi++;elsefound=1;//找到returnfound;}template<typenameT,intsize>boolseqlist<T,size>::Insert(T&x,inti){//在第i个位置 int
超出表项范 末if(i<0||i>last+1||last==Maxsize-1)returnfalse; for(j=last;j>i;j--)slist[j]=slist[j-//从表最后位置向前依次移动,空出指定位置returntrue;}}template<typenameT,intboolseqlist<T,size>::Remove(T&x){//删除int //先去找x在哪个位slist[j]=slist[j+1];//依次前移,保证表连return}return //表中不存在}template<typenameT,intsize>intseqlist<T,size>::Next(T&x){ intif(i>=0&&i<last)return //x后继位elsereturn //x不在表中,或在表末}template<typenameT,intsize>intseqlist<T,size>::Prior(T&x){ intif(i>0&&i<=last)returni- //x前驱的位elsereturn-}voidseqlist<int,100>s;//顺序表对象s的元素为整intfor(j=0;j<10;j//把素数写ifcout<<"表太大放不下了!"<<endl;break; for(i=0;i<j;icout<<s.Get(icout<<endl;//打印出s.slist素数表k=7;//因函数IsIn(k)形参 ,所以实参不可用整数常量if(s.IsIn(k)cout<<"素数7在顺序表中endl;elsecout<<"素数7不在顺序表中"<<endl;if(s.Removek)cout<<"删除素数17"<<endl//删除素数elsecout<<"找不到素数17,无法删除j=s.Length()for(i=0;i<j;icout<<s.Get(i//打印剩下的素if(s.Insert(k,j-1)){//把素数17装 到j-1位置)回去,成功则打j=s.Length(for(i=0;i<j;i++)cout<<s.Get(i)<<'';}cout<<“素数17在表中位置(下标)为"<<s.Find(k)<<endl;if(s.IsEmpty())cout<<"表是空的"<<endl;elsecout<<"表不空ifs.IsFull())cout<<"表是满的"<<endl;elsecout<<"表不满"<<endl;if(s.IsIn(k))cout<<"素数17在表中}2 打印17素数17在表中位置(下标)为:8素数176.2人们经常需要在一个数据集合中搜寻满足特定条件的查找:从一个数据集合中找出特定元素的过程。特定元素:某个域具有特定的值。 顺序查找的执行时间函数的阶为n6.2.1顺序查找查找是按关键字(keyword)进行。可以唯一地把资料区分出来structintid; charname[20]; charsex; int char //floateng,phy,mathelectron;//学号可作为主关键字 这时可以采用对半查找(binarysearch)。有序数 mid=(low+high)/2,如mid指向元素是所查找的,则结束。如果该元素关键字大了,则取low=mid1,high不变,继续查找;如果该元素关键字小了,则取high=mid-1,low不变,继续查找。如果查到
查
查找成功
midlowmid 查
25789 9low
9lowmid9while(区间 if(中点处的元素值等于指定值{返回区间中点的下标};else{确定下一步 }【例6.4】对半查找递归算法,作为有序表模板类成员 【例6.5】对半查找迭代算法*本例中出现的成员函数Binarysearch(T&x)const,const成员函数,该函数保证只读。相应节点对象template<typenameT,intsizeintconstT&x)const{inthigh=last,low=0,mid;//last当前有序表最大下标if(x<slist[mid])high=mid-1;//elseif(slist[mid]<xlow=mid+1//右缩查找区elsereturn}returnmid;}classintbooloperator<(Elemen returnkey<ele.key;}booloperator!=(Elemen returnkey!=ele.key;}voidputkey(intk }//void }//重载比较运算符,元素比较,实际是元素关键域的比intconstinth=19;inti,k=47; ement,100>int47,53,59,61,67//Elementn[h],elem;for(i=0;i<h;i++)n[i].putkey(a[i]);for(i=0;i<h;i++)ordlist.Insert(n[i],i); 性 入,建立升序顺序cout<<"整数"<<k<<"在表中位置(下标cout<<"整数"<<k<<"在表中位置(下标return}6.6.2常用的排序将数据元素的无序序列调整为一个有序序 最常见的 排序(Insert直 设整数数组为a: 824| 835824| 83535|18 【例6.6】升序直 排序算template<typenameT,intTtemp;intfor(i=1;i<=last;i++){//将下标为1~last的元素逐 while(j>0&&temp<slist[j-1]){ //查找与移动同时}slist[j]=temp; 位置已找到}}classstring bool e){returnvoidputkey(stringvoidintconstinth=10;Elementint ement,100>stringfor(i=0;i<h;i++)n[i].putkey(mslist[i]);for(i=0;i<h;i++)ordlist.Insert(n[i],i);//建立顺序表return【例6.7】升序对 template<typenameT,intsize>voidTintfor(i=1;i<=last;i++){high=i-while(low<=high){ if(temp<slist[mid])high=mid-1;elselow=mid+1;}for(j=i-1;j>=low;j--)} i012345i05 01345 0345
对数组ai1遍2遍3遍4遍02345 for(k=nk>ik //第i次冒if(slist[k-1]>slist[k]) //发生} //终止i循}【例6.8】冒泡排序算template<typenameT,intsize>boolnoswap;inti,j;Ttemp;for(i=0;i<last;i++){ //从下往上冒泡if(slist[j]<slist[j-1]) }if(noswap)break;//}}【例6.8】冒泡排序算class id; stringname; charsex; string //floateng,phy,math,electron;//英语,物理,booloperator<(studen e){return id<ele.id;}voidshow(){intmain(){constinth=4;inti;Orderedlist<student,100>ordlist;studentn[h]={ 路58号student(6004121,"关雨 路64号 路37号 ",'m',18,"重庆路95号for(i=0;i<h;i++) //建立顺序return}【例6.9】直接选择作为Orderedlist<T,size>类的template<typenamevoidOrderedlist<T>::SelectSort(){inti,j,k; Tte
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工人装修施工免责协议
- 小儿高热惊厥课件
- 护理甲状腺结节
- 2024年度工程翻译服务合同翻译质量标准3篇
- 河南师范大学《下乡写生》2022-2023学年第一学期期末试卷
- 《外汇入门手册》课件
- 2024年度预拌混凝土购销合同(含质量保证金条款)2篇
- 电商运营培训心得体会
- 2024年度建筑工程项目贷款居间合同3篇
- 基于2024年度计划的农产品批量采购合同3篇
- 科学版五年级《体育与健康基础知识-体育活动与营养》说课稿
- 混凝土减水剂测试指标培训课件
- 走进舞蹈艺术-首都师范大学中国大学mooc课后章节答案期末考试题库2023年
- 高标准农田跟踪审计投标合理化建议
- 谷子栽培学课件
- 2022版18项医疗核心制度
- 铜陵有色金属集团股份有限公司冬瓜山铜矿废水处理设施升级改造项目环评报告
- 中医病证诊断疗效
- (完整版)书籍装帧设计
- 六年级数学辅差作业
- 部编版小学语文 阅读训练 鲁迅 (含答案)
评论
0/150
提交评论