模板与数据结构.ppt
《模板与数据结构.ppt》由会员分享,可在线阅读,更多相关《模板与数据结构.ppt(58页珍藏版)》请在课桌文档上搜索。
1、第6章 模板与数据结构,模板的引入:,6.1 模板,增强代码的通用性,使之不受数据类型的限制。,模板的实现:,将数据类型作为参数。,功能:创建一个通用功能的函数,支持多种不同形参,简化重载函数的函数体设计。,6.1.1 函数模板及其应用,函数模板定义:template返回类型 函数名(形式参数表);,例.找出三个数中的最大数,通过函数模板来实现。,#include using namespace std;template/模板声明,其中T为类型参数T max(T a,T b,T c)/定义一个通用函数,用T作虚拟的类型名 if(ba)a=b;if(ca)a=c;return a;,int ma
2、in()int i1=185,i2=-76,i3=567,i;double d1=56.8,d2=90.2,d3=-314.7,d;long g1=6785,g2=-91245,g3=6734,g;/调用模板函数,此时T被int取代,也可缺省 i=max(i1,i2,i3);/调用模板函数,此时T被double取代 d=max(d1,d2,d3);/调用模板函数,此时T被long取代 g=max(g1,g2,g3);cout“i_max=“iendl;cout“f_max=“dendl;cout“g_max=“gendl;return 0;,函数模板注意事项,用函数模板比函数重载更方便,程序更
3、简洁。但它只适用于函数的参数个数相同而类型不同,且函数体相同的情况,若参数的个数不同,则不能用函数模板。,若有两个或多个类,其功能相同,仅数据类型不同:class Compare_int/对两个整数作比较public:Compare_int(int a,int b)x=a;y=b;int max()return(xy)?x:y;int min()return(xy)?x:y;private:int x,y;,6.1.2 类模板与线性表,若要比较两个浮点数大小呢?,类模板定义:,template class 类模板名./类体;,类模板名 对象名1,对象名n;/可带参数,template返回类型
4、类模板名:成员函数名(形参表)/成员函数体,在类模板外定义成员函数,应采用以下形式:,使用模板建立对象:,用类模板实现:,template/虚拟类型numtypeclass Compare/类模板名为Compare public:Compare(numtype a,numtype b)x=a;y=b;numtype max()return(xy)?x:y;numtype min()return(xy)?x:y;private:numtype x,y;,#include/类模板应用举例#include using namespace std;class Student/定义结构体类型Studen
5、t public:int id;/学号float gpa;/平均分 Student(int i=0,float g=0):id(i),gpa(g);template/类模板,实现对任意类型数据进行存取class Store T item;/存放任意类型数据int Valued;/标记item是否已被存入内容 public:Store();/默认形式的构造函数T GetElem();/提取数据函数void PutElem(T x);/存入数据函数;,templateStore:Store():Valued(0)templateT Store:GetElem()if(Valued=0)coutvo
6、id Store:PutElem(T x)Valued+;/将此置为ture,表示item中已存入数值 item=x;/将x值存入item,void main()Student g(1000,23);/声明Student类型结构体变量,赋以初值 Store S1,S2;/声明两个Store类对象 Store S3;/声明Store类对象S3 Store D;/声明Store类对象D S1.PutElem(3);/向对象S1中存入数据(初始化对象S1)S2.PutElem(-7);/向对象S2中存入数据(初始化对象S2)coutS1.GetElem()S2.GetElem()endl;/S1和S
7、2的数据成员 S3.PutElem(g);/向对象S3中存入数据 coutS3.GetElem().idendl;/输出对象S3的数据成员 cout“Retrieving object Dn”;coutD.GetElem()endl;/输出对象D的数据成员/由于D未初始化,在执行函数D.GetElem()过程中导致程序终止 return 0;,线性表,静态数组:由编译器编译时分配内存,数组的长度不可改变。防止的溢出:一般采用“大开小用”的方法,且应在添加新数据时判断表是否满。,直接前驱,直接后继,图6.2 向表中插入一个数据,【例6.3】顺序表类模板,template class seqlis
8、t T slistsize;/存放顺序表的数组 int Maxsize;/最大可容纳项数 int last;/已存表项的最后位置public:seqlist()last=-1;Maxsize=size;/初始化为空表 int Length()constreturn last+1;/计算表长度 int Find(T,检验主程序,常成员函数:只能引用本类中的数据成员,不能修改,template int seqlist:Find(T/找到,返回下标,template bool seqlist:IsIn(T,template T,template bool seqlist:Insert(T,templ
9、ate bool seqlist:Remove(T/表中不存在x,template int seqlist:Next(T,int main()seqlist seqlisti;/顺序表对象seqlisti的元素为整型 int i,j,k,a10=2,3,5,7,11,13,17,19,23,29;for(j=0;j_|endl;break;j=seqlisti.Length();for(i=0;ij;i+)coutseqlisti.Get(i);cout endl;/打印出seqlisti.slist-素数表 for(j=0;j10;j+)seqlistij=0;/采用下标运算符运算 for(
10、j=0;j10;j+)coutseqlistij;coutendl;for(j=0;j10;j+)seqlistij=aj;,seqlisti10=31;/实验能否增加元素 for(j=0;j11;j+)coutseqlistij;coutendl;k=7;if(seqlisti.IsIn(k)cout素数7在顺序表中 endl;/因形参为引用,所以实参不可用整数常量7 else cout 素数7不在顺序表中endl;k=17;if(seqlisti.Remove(k)cout删除素数17endl;/删除素数17 else cout找不到素数17,无法删除;j=seqlisti.Length(
11、);for(i=0;ij;i+)coutseqlisti.Get(i);/打印剩下的素数 coutendl;,if(seqlisti.Insert(k,j-1)/把素数17装回去,成功则打印 j=seqlisti.Length();for(i=0;ij;i+)coutseqlisti.Get(i);coutendl;cout“打印17后一个素数:“seqlisti.Get(seqlisti.Next(k)endl;cout“打印17前一个素数:”seqlisti.Get(seqlisti.Prior(k)endl;cout“素数17在表中位置(下标)为:“seqlisti.Find(k)end
12、l;if(seqlisti.IsEmpty()cout表是空的endl;else cout表不空endl;if(seqlisti.IsFull()cout表是满的endl;else cout表也不满endl;if(seqlisti.IsIn(k)cout素数17在表中endl;return 0;,6.2 排序与查找,例如字典:字典中的词条是按序存放的,我们才能按字母顺序找到要查的字。,排序(sorting):,查找(search):,在数据集合中寻找满足条件的数据对象,找到后进一步给出对象的具体信息,在数据库技术中称为检索。,6.2.1 常用查找方法,查找按关键字(key word)进行。可以



- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模板 数据结构

链接地址:https://www.desk33.com/p-230100.html