您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 锟节撅拷锟斤拷群锟斤拷锟斤拷锟饺猴拷锟斤拷锟斤拷莸锟斤拷锟街.
第九章群体类和群体数据的组织C++语言程序设计引言在C++中,有基本数据类型和自定义数据类型基本类型是C++编译系统预定义的自定义类型是由多个基本类型或自定义类型的元素组成的,称为群体数据对于群体数据,仅有系统预定义的操作是不够的,在很多情况下,需要设计与某些具体问题相关的特殊操作,并按面向对象的方法将数据与操作封装起来,这就是群体类引言群体分类两类:线性群体:线性群体中的元素按位置排列有序,数组是典型例子非线性群体:非线性群体不用位置顺序来标识元素,如企业中职员的上下级关系,家族谱信息关于群体数据的组织是属于数据结构的范畴。在此只介绍两类常用算法:排序和查找方法排序:称为分类或整理,是将一个无序序调整为有序的过程。在排序过程中需要完成两种基本操作:1、比较两个数的大小;2、调整元素在序列中的位置。查找:是在一个序列中按照某种方式找出需要的特定数据元素的过程。查字典就是一个典型例子本章主要内容模板群体类群体数据的组织第一部分—模板C++最重要的特性之一就是代码重用,为实现代码重用,代码必须具有通用性。通用代码需要不受数据类型的影响,并且可以自动适应数据类型的变化。这种程序设计类型称为参数化程序设计。模板是C++支持参数化程序设计的工具,通过它可以实现参数的多态性参数的多态性:是指将程序所处理的对象的类型参数化,使得一段程序可以用于处理多种不同类型的对象函数模板类模板函数模板函数重载通常是对于不同的数据类型完成类似的操作。很多情况下,一个算法是可以处理多种数据类型的。但是用函数实现算法时,即使设计为重载函数也只是使用相同的函数名,函数体仍然要分别定义intabs(intx){returnx0?-x:x;}doubleabs(doublex){returnx0?-x:x;}上述函数只是参数类型不同,功能完全一样。类似的情况,如能写一段通用的代码,则可进一步提高代码复用质量,提高软件开发效率,这也是使用函数模板的原因。函数模板函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。声明方法:templatetypename标识符//表示类型参数表类型名函数名(参数表){函数体的定义}//函数模板中函数体的定义与定义其它函数类似函数模板求绝对值函数的模板#includeiostreamusingnamespacestd;templatetypenameTTabs(Tx){returnx0?-x:x;}intmain(){intn=-5;doubled=-5.5;coutabs(n)endl;coutabs(d)endl;}函数模板运行结果:55.5求绝对值函数的模板分析编译器从调用abs()时实参的类型,推导出函数模板的类型参数。例如,对于调用表达式abs(n),由于实参n为int型,所以推导出模板中类型参数T为int。当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数:intabs(intx){returnx0?-x:x;}函数模板函数模板的实例#includeiostreamusingnamespacestd;templateclassTvoidoutputArray(constT*P_array,constintcount){for(inti=0;icount;i++){coutP_array[i];coutendl;}intmain(){constintaCount=8,bCout=8,cCount=20;intaArray[aCount]={1,2,3,4,5,6,7,8};doublebArray[bCount]={1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8};charcArray[cCount]=welcometoseeyou;coutaArraycontains:endl;outputArray(aArray,aCount);coutbArraycontains:endl;outputArray(bArray,bCount);coutcArraycontains:endl;outputArray(cArray,cCount);}函数模板的实例讲解函数模板中声明了类型参数T,表示一种抽象的类型。当编译器检测到程序中调用函数模板outputArray时,便用outputArray的第一个实参的类型替换掉整个模板定义中的T,并建立用来输出指定类型数组的一个完整的函数,再编译此新建的函数模板函数与重载是密切相关的。从函数模板产生的相关函数都是同名的,编译器用重载的解决方法调用相应的函数类模板的作用使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型)。类是对一组对象的公共性质的抽象,而类模板则是对不同类的公共性质的抽象,因此,类模板属于更高层次的抽象。由于类模板需要一种或多种类型参数,所以类模板也常常称为参数化类类模板类模板的声明类模板:template模板参数表class类名{类成员声明}如果需要在类模板以外定义其成员函数,则要采用以下的形式:template模板参数表类型名类名T::函数名(参数表)类模板类模板的声明“模板参数表”由用逗号分隔的若干类型标识符或常量表达式构成,其内容包括:1、class(或typename)标识符,指明可以接受一个类型参数2、类型说明符标识符,指明可以接受一个由“类型说明符”所规定类型的常量作为参数当“模板参数表”同时包括上述多项内容时,各项内容以逗号分隔。应注意的是:模板类的成员函数必须是函数模板。类模板对象的声明一个类模板声明自身不产生代码,它说明了类的一个家族。只有当被其它代码引用时,模板才根据引用的需要产生代码。使用一个模板类来建立对象时,应按如下形式声明:模板模板参数表对象名1,………例9-2类模板应用举例#includeiostream#includecstdlibusingnamespacestd;//结构体StudentstructStudent{intid;//学号floatgpa;//平均分};类模板声明一个实现任意类型数据存取的类模板Store,然后通过具体数据类型参数对类模板进行实例化,生成类,然后灰再被实例化具体对象templateclassT//类模板:实现对任意类型数据进行存取classStore{private:Titem;//用于存放任意类型的数据inthaveValue;//用于标记item是否已被存入内容public:Store(void);//默认形式(无形参)的构造函数TGetElem(void);//提取数据函数voidPutElem(Tx);//存入数据函数};//默认形式构造函数的实现templateclassTStoreT::Store(void):haveValue(0){}17templateclassT//提取数据函数的实现TStoreT::GetElem(void){//如果试图提取未初始化的数据,则终止程序if(haveValue==0){coutNoitempresent!endl;exit(1);}returnitem;//返回item中存放的数据}templateclassT//存入数据函数的实现voidStoreT::PutElem(Tx){haveValue++;//将haveValue置为TRUE,表示item中已存入数值item=x;//将x值存入item}18intmain(){Studentg={1000,23};StoreintS1,S2;StoreStudentS3;StoredoubleD;S1.PutElem(3);S2.PutElem(-7);coutS1.GetElem()S2.GetElem()endl;S3.PutElem(g);coutThestudentidisS3.GetElem().idendl;coutRetrievingobjectD;coutD.GetElem()endl;//输出对象D的数据成员//由于D未经初始化,在执行函数D.GetElement()时出错}19第二部分—群体数据线性群体线性群体的概念直接访问群体--数组类顺序访问群体--链表类栈类队列类群体的概念群体是指由多个数据元素组成的集合体。群体可以分为两个大类:线性群体和非线性群体。线性群体中的元素按位置排列有序,可以区分为第一个元素、第二个元素等非线性群体不用位置顺序来标识元素。线性群体的概念线性群体中的元素次序与其位置关系是对应的。在线性群体中,又可按照访问元素的不同方法分为直接访问、顺序访问和索引访问。在本章我们只介绍直接访问和顺序访问。…第一个元素第二个元素第三个元素最后一个元素线性群体的概念还有两种特殊的线性群体-栈和队列。栈:只能从一端访问的线性群体,可以访问的这一端称为栈顶,另一端称栈底。对栈顶位置的标记称为栈顶指针,对栈底位置的标记称为栈底指针。具有“后进先出”LIFO的特性(如函数调用)队列:是只能向一端添加元素,从另一端删除元素的线性群体,可以添加元素的一端称为队尾,可以删除元素的一头称为队头。具有“先进先出”FIFO特性数组静态数组是具有固定元素个数的群体,其中的元素可以通过下标直接访问。缺点:大小在编译时就已经确定,在运行时无法修改。动态数组由一系列位置连续的,任意数量相同类型的元素组成。优点:其元素个数可在程序运行时改变。动态数组类模板:例9-3(9_3.h)直接访问的线性群体#ifndefARRAY_CLASS#defineARRAY_CLASSusingnamespacestd;#includeiostream#includecstdlib#ifndefNULLconstintNULL=0;#endif//NULLenumErrorType{invalidArraySize,memoryAllocationError,indexOutOfRange};char*errorMsg[]={Invalidarraysize,Memoryallocationerror,Invalidindex:};动态数组类模板程序25templateclassTclassArray{private:T*alist;intsize;voidError(ErrorTypeerror,intbadIndex=0)const;public:Array(intsz=50);Array(constArrayT&A);~Array(void);ArrayT&operator=(constArrayT&rhs);T&operator[](inti);operatorT*(void)const;intListSize(void)const;voidResize(intsz);};26数组类模板的构造函数//构造函数templateclassTArrayT::Array(intsz){if(sz=0)//sz为数组大小(元素个数),若小于0,则输出错误信息Error(invalidArraySize);size=sz;//将元素个数赋值给变量sizealist=newT[size];//动态分配size个T类型的元素空间if(alist==NULL)//如果分配内存不成功,输出错误信息Error(memoryAllocationError);}直接访问的线性群体数组类的拷贝构造函数templateclassTArrayT::Array(constArrayT&X){intn=X.size;size=n;alist=newT[n];if(alist==NULL)Error(memoryAllocationError);T
本文标题:锟节撅拷锟斤拷群锟斤拷锟斤拷锟饺猴拷锟斤拷锟斤拷莸锟斤拷锟街.
链接地址:https://www.777doc.com/doc-1974590 .html