




已阅读5页,还剩84页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,本章主要内容,模板群体类群体数据的组织深度探索,2,第一部分:模板,函数模板类模板,3,函数模板,函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。定义方法:template函数定义模板参数表的内容类型参数:class(或typename)标识符常量参数:类型说明符标识符模板参数:templateclass标识符,函数模板,4,求绝对值函数的模板,#includeusingnamespacestd;templateTabs(Tx)returnx0?-x:x;intmain()intn=-5;doubled=-5.5;coutabs(n)endl;coutabs(d)endl;return0;,函数模板,运行结果:55.5,5,求绝对值函数的模板分析,编译器从调用abs()时实参的类型,推导出函数模板的类型参数。例如,对于调用表达式abs(n),由于实参n为int型,所以推导出模板中类型参数T为int。当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数:intabs(intx)returnx0?x:x;,函数模板,6,类模板的作用,使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型)。,类模板,7,类模板的声明,类模板:templateclass类名类成员声明如果需要在类模板以外定义其成员函数,则要采用以下的形式:template类型名类名:函数名(参数表),类模板,8,例9-2类模板应用举例,#include#includeusingnamespacestd;/结构体StudentstructStudentintid;/学号floatgpa;/平均分;,类模板,templateclassStore/类模板:实现对任意类型数据进行存取private:Titem;/item用于存放任意类型的数据boolhaveValue;/haveValue标记item是否已被存入内容public:Store();/缺省形式(无形参)的构造函数T/以下实现各成员函数。template/缺省构造函数的实现Store:Store():haveValue(false),9,template/提取数据函数的实现T/将x值存入item,10,intmain()Stores1,s2;s1.putElem(3);s2.putElem(-7);couts3;s3.putElem(g);coutd;coutRetrievingobjectD.;coutd.getElem()pi;intmain()inta10;read(a,10);return0;,#includeArray.h#includeusingnamespacestd;voidread(int*p,intn)for(inti=0;ipi;intmain()Arraya(10);read(a,10);return0;,直接访问的线性群体,26,Array类的应用,例9-4求范围2N中的质数,N在程序运行时由键盘输入。,直接访问的线性群体,#include#include#includeArray.husingnamespacestd;intmain()Arraya(10);/用来存放质数的数组,初始状态有10个元素。intn,count=0;cout=2asupperlimitforprimenumbers:;cinn;for(inti=2;i=n;i+)boolisPrime=true;for(intj=0;jcount;j+)if(i%aj=0)/若i被aj整除,说明i不是质数isPrime=false;break;if(isPrime)if(count=a.getSize()a.resize(count*2);acount+=i;for(inti=0;icount;i+)coutsetw(8)ai;coutnext;returntempPtr;,tempPtr,33,链表的基本操作,生成结点插入结点查找结点删除结点遍历链表清空链表,顺序访问的线性群体,34,链表类模板(例9-6),顺序访问的线性群体,#ifndefLINKEDLIST_H#defineLINKEDLIST_H#includeNode.htemplateclassLinkedListprivate:/数据成员:Node*front,*rearNode*prevPtr,*currPtr;intsize;intposition;Node*newNode(constT,LinkedList#endif/LINKEDLIST_H,35,链表类应用举例(例9-7),顺序访问的线性群体,/9_7.cpp#include#includeLinkedList.husingnamespacestd;intmain()LinkedListlist;for(inti=0;iitem;list.insertFront(item);coutList:;list.reset();while(!list.endOfList()coutlist.data();list.next();coutkey;list.reset();while(!list.endOfList()if(list.data()=key)list.deleteCurrent();list.next();coutList:;list.reset();while(!list.endOfList()coutlist.data();list.nextcoutendl;return0;,36,特殊的线性群体栈,栈是只能从一端访问的线性群体,可以访问的这一端称栈顶,另一端称栈底。,特殊的线性群体栈,37,栈的应用举例表达式处理,特殊的线性群体栈,38,栈的基本状态,栈空栈中没有元素栈满栈中元素个数达到上限一般状态栈中有元素,但未达到栈满状态,特殊的线性群体栈,39,40,栈的基本操作,初始化入栈出栈清空栈访问栈顶元素检测栈的状态(满、空),特殊的线性群体栈,41,栈类模板(例9-8),特殊的线性群体栈,/Stack.h#ifndefSTACK_H#defineSTACK_H#includetemplateclassStackprivate:TlistSIZE;inttop;,public:Stack();voidpush(constT/类的实现略,42,栈的应用,例9.9一个简单的整数计算器实现一个简单的整数计算器,能够进行加、减、乘、除和乘方运算。使用时算式采用后缀输入法,每个操作数、操作符之间都以空白符分隔。例如,若要计算3+5则输入35+。乘方运算符用表示。每次运算在前次结果基础上进行,若要将前次运算结果清除,可键入c。当键入q时程序结束。Calculator.hCalculator.cpp9_9.cpp,特殊的线性群体栈,/Calculator.h#ifndefCALCULATOR_H#defineCALCULATOR_H#includeStack.h/包含栈类模板定义文件classCalculator/计算器类private:Stacks;/操作数栈voidenter(doublenum);/将操作数num压入栈/连续将两个操作数弹出栈,放在opnd1和opnd2中boolgetTwoOperands(double#endif/CALCULATOR_H,43,/Calculator.cpp#includeCalculator.h#include#include#includeusingnamespacestd;/工具函数,用于将字符串转换为实数inlinedoublestringToDouble(conststring,44,boolCalculator:getTwoOperands(double,45,voidCalculator:compute(charop)/执行运算doubleoperand1,operand2;boolresult=getTwoOperands(operand1,operand2);if(result)/如果成功,执行运算并将运算结果压入栈switch(op)case+:s.push(operand2+operand1);break;case-:s.push(operand2-operand1);break;case*:s.push(operand2*operand1);break;case/:if(operand1=0)/检查除数是否为0cerrDividedby0!endl;s.clear();/除数为0时清空栈elses.push(operand2/operand1);break;case:s.push(pow(operand2,operand1);break;default:cerrUnrecognizedoperator!endl;break;cout=s.peek()str,str!=q)switch(str0)casec:s.clear();break;case-:/遇-需判断是减号还是负号if(str.size()1)enter(stringToDouble(str);elsecompute(str0);break;case+:/遇到其它操作符时case*:case/:case:compute(str0);default:/若读入的是操作数,转换为整型后压入栈enter(stringToDouble(str);break;voidCalculator:clear()/清空操作数栈s.clear();,47,/9_9.cpp#includeCalculator.hintmain()Calculatorc;c.run();return0;,48,49,特殊的线性群体队列,队列是只能向一端添加元素,从另一端删除元素的线性群体,50,队列的基本状态,队空队列中没有元素队满队列中元素个数达到上限一般状态队列中有元素,但未达到队满状态,特殊的线性群体队列,元素移动方向,元素移动方向,51,52,循环队列,在想象中将数组弯曲成环形,元素出队时,后继元素不移动,每当队尾达到数组最后一个元素时,便再回到数组开头。,特殊的线性群体队列,53,54,第三部分:群体数据的组织,插入排序选择排序交换排序顺序查找折半查找,55,排序(sorting),排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。数据元素:数据的基本单位。在计算机中通常作为一个整体进行考虑。一个数据元素可由若干数据项组成。关键字:数据元素中某个数据项的值,用它可以标识(识别)一个数据元素。在排序过程中需要完成两种基本操作:比较两个数的大小调整元素在序列中的位置,群体数据的组织,56,内部排序与外部排序,内部排序:待排序的数据元素存放在计算机内存中进行的排序过程。外部排序:待排序的数据元素数量很大,以致内存存中一次不能容纳全部数据,在排序过程中尚需对外存进行访问的排序过程。,群体数据的组织,57,内部排序方法,插入排序选择排序交换排序,群体数据的组织,58,插入排序的基本思想,每一步将一个待排序元素按其关键字值的大小插入到已排序序列的适当位置上,直到待排序元素插入完为止。,初始状态:541020123,59,直接插入排序,在插入排序过程中,由于寻找插入位置的方法不同又可以分为不同的插入排序算法,这里我们只介绍最简单的直接插入排序算法。例9-11直接插入排序函数模板(9_11.h),群体数据的组织,templatevoidinsertionSort(Ta,intn)inti,j;Ttemp;for(inti=1;i0,直接插入排序函数模板(9_11.h),60,61,选择排序的基本思想,每次从待排序序列中选择一个关键字最小的元素,(当需要按关键字升序排列时),顺序排在已排序序列的最后,直至全部排完。,341020125,341020125,第i次选择后,将选出的那个记录与第i个记录做交换。,62,直接选择排序,在选择类排序方法中,从待排序序列中选择元素的方法不同,又分为不同的选择排序方法,其中最简单的是通过顺序比较找出待排序序列中的最小元素,称为直接选择排序。例9-12直接选择排序函数模板(9-12.h),群体数据的组织,templatevoidmySwap(T,直接选择排序函数模板(9-12.h),63,64,交换排序的基本思想,两两比较待排序序列中的元素,并交换不满足顺序要求的各对元素,直到全部满足顺序要求为止。,群体数据的组织,65,最简单的交换排序方法起泡排序,对具有n个元素的序列按升序进行起泡排序的步骤:首先将第一个元素与第二个元素进行比较,若为逆序,则将两元素交换。然后比较第二、第三个元素,依次类推,直到第n-1和第n个元素进行了比较和交换。此过程称为第一趟起泡排序。经过第一趟,最大的元素便被交换到第n个位置。对前n-1个元素进行第二趟起泡排序,将其中最大元素交换到第n-1个位置。如此继续,直到某一趟排序未发生任何交换时,排序完毕。对n个元素的序列,起泡排序最多需要进行n-1趟。,群体数据的组织,66,起泡排序举例,对整数序列85243按升序排序,85243,5,2,4,3,8,2,4,3,5,8,2,3,4,5,8,2,3,4,5,8,初始状态,第一趟结果,第二趟结果,第三趟结果,第四趟结果,小的逐渐上升,每趟沉下一个最大的,群体数据的组织,67,例9-13起泡排序函数模板,templatevoidmySwap(T,templatevoidbubbleSort(Ta,intn)inti=n1;while(i0)intlastExchangeIndex=0;for(intj=0;j*b)?a:b;,84,深度探索,模板元编程,什么是模板元编程在模板实例化的同时利用编译器完成一些计算任务模板元编程可以把一些通常在运行时才能计算的任务提前到编译时,从而:提高程序运行效率提供一些方便例:模板元编程的计算结果可以作为静态数组的大小,85,深度探索,例:编译时计算
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年滁州市机械工业学校公开引进教育紧缺人才8人模拟试卷及答案详解(新)
- 2025广东广州中山大学孙逸仙纪念医院博士后招聘考前自测高频考点模拟试题及答案详解(易错题)
- 2025黑龙江省设计集团有限公司面向社会及校园招聘财务人员2人笔试历年参考题库附带答案详解
- 2025陕西西安市建筑设计研究院有限公司3月招聘笔试历年参考题库附带答案详解
- 2025陕西延长石油物流集团有限公司包装制品分公司人员招聘32人笔试历年参考题库附带答案详解
- 2025重庆对外贸易进口有限公司招聘2人笔试历年参考题库附带答案详解
- 2025贵州民航产业集团有限公司社会招聘笔试历年参考题库附带答案详解
- 2025贵州六盘水鑫贵仁产业投资服务有限公司面向社会招聘3人笔试历年参考题库附带答案详解
- 2025福建省青山纸业股份有限公司招聘43人笔试历年参考题库附带答案详解
- 2025福建省人力资源发展集团有限公司邵武分公司招聘212人笔试历年参考题库附带答案详解
- 2025至2030中国大宗物资供应链行业发展趋势分析与未来投资战略咨询研究报告
- 胰岛素储存知识培训课件
- GB 46039-2025混凝土外加剂安全技术规范
- 2025至2030年中国卡丁车俱乐部行业市场调研分析及投资战略咨询报告
- 加油站职业健康危害因素分析
- 辽宁省沈阳市2025届高考语文模拟试卷(含答案)
- 公路统计管理办法
- 危重症患者的疼痛管理
- 电力建设安全规程2025新版
- 2024年法考真题及答案解析
- 2025年苏州市中考数学试卷真题(含答案解析)
评论
0/150
提交评论