template 的用法.doc_第1页
template 的用法.doc_第2页
template 的用法.doc_第3页
template 的用法.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

template 的用法在程序设计当中经常会出现使用同种数据结构的不同实例的情况。例如:在一个程序中 可以使用多个队列、树、图等结构来组织数据。同种结构的不同实例,也许只在数据元素 的类型或数量上略有差异,如果对每个实例都重新定义,则非常麻烦且容易出错。那么能 否对同种类型数据结构仅定义一次呢?答案是肯定的,C+提供的类模板(Class Template )就可以实现该功能。 一、类模板 类模板是C+提供的一种特殊机制,通过它我们可以定义一种特殊的类(称为模板类),在类 的定义中可以包含待定的类型参数,在声明类的实例时,系统会自动根据传递的类型生成 用户想要生成的类实例。下面是用C+实现的一个简单的模板类Clist的定义。 Template class CList public: int SetItem(int Index, const T &Item); int GetItem(int Index, T &Item); private: T Buffer; 在这里,T是类型参数,I是整型常量参数。T和I的实际值是在声明具体类实例时指定的。 模板类的号内可以包括任意个类型参数和常量参数(至少要有一个参数)。类型参数和 常量参数可以是任何合法的标准类型和用户自定义类型,包括简单类型及各种结构体。同 其他类一样,类成员函数SetItem的实现可以在类定义内完成,也可以在类CList定义处实 现: template int CList:SetItem(int Index, const T &Item) if ( (IndexI-1) ) return 0; / 出错 BufferIndex= Item ; return 1; / 成功 值得注意的是,在类定义外完成函数实现时,必须以关键字template和类模板定义中相同 的参数表(号内的)开头(上例为template),并且范围分解操作符前的 类名后应跟上模板参数名清单(上例为CList)。另外,与非模板类不同的是,必须将 函数实现包括在调用它的每个源文件中,使编译器能从函数实现产生代码。通常的做法是 将模板类的函数实现也放在定义该类的头文件中,这样只需在调用的源文件中包含该头文 件即可。 那么,如何使用生成特定的类实例呢?我们可以像使用其他类一样来使用模板类,不过必须 指定模板参数的值。例如采用如下声明: CList IntList; 则使IntList成为CList类的实例,每次出现的T参数都换成int, 每次出现的I参数都换成 100。这样,IntList类中的Buffer就是一个长度为100的整型数组,SetItem和GetItem函数 参数是int值的引用。例: IntList.SetItem(0, 5); /给数组第一个元素赋为整数5 模板类还可以像其他类一样可以定义构造函数和析构函数。下面我们以一种简单的数据 结构堆栈为例,来说明如何用类模板来构造通用数据结构。 二、 利用类模板实现通用堆栈结构 任何抽象数据结构在计算机中的实现,归根结底都只有两种方式:顺序存储(用数组实现) ,链式存储(用指针实现)。堆栈也不例外,按其实现方式可分为顺序栈(用数组实现)和链 栈(用指针实现)。 1. 通用顺序栈的实现 因为顺序栈中的元素在空间上连续存储,栈顶的元素位置需要注明,所以构造顺序栈的模 板类应该有这样的一些成员变量:一个待定类型和长度的数组Buffer,一个记录栈顶元素 的数组下标的整型变量top。堆栈的基本操作主要有:入栈(Push)、出栈(Pop)、置空(Se tEmpty)、判断当前状态(IsEmpty)等,它们应用模板类的成员函数来实现。作为一个标准 的类,它还应该有自己的构造函数和析构函数。具有这些功能的模板类,就可以作为一个 通用的顺序栈来使用了。该类的定义如下: template class CArrayStackTemp public: CArrayStackTemp () /缺省构造函数,构造一个空堆栈 top= -1; ; CArrayStackTemp ();/析构函数 void SetEmpty (); /置空堆栈 bool IsEmpty(); /判断堆栈是否为空 bool Push(T element); /入栈 bool Pop(T& element);/出栈 private: T BufferSIZE; int top; ; 与堆栈的基本操作相对应的成员函数的实现如下: template void CArrayStackTemp: SetEmpty () top= -1; /将栈顶指针赋 -1,并不实际清除数组元素 template bool CArrayStackTemp: IsEmpty () return(top = -1); template bool CArrayStackTemp: Push (T element ) top+; if (topSIZE-1) top-; return false; /堆栈已满,不能执行入栈操作 Buffertop=element; return true; template void CArrayStackTemp: Pop (T& element ) if (IsEmpty() return false; element =Buffertop; top-; return true; 根据实际需要,还可以扩充堆栈功能。例如:加入取栈顶元素、求堆栈长度等操作,其方法 如上。 2. 通用链栈的实现 模板类中允许使用指针和定义自己的结构,这就为实现链式结构提供了保证。这里采用一 个单链表来实现堆栈,栈顶指针指向链表的第一个结点,入栈和出栈均在链表的头进行。 该模板类的定义如下: template class CLinkStackTemp public: /类的缺省构造函数,生成一个空堆栈 CLinkStackTemp () top=NULL; ; ClinkStackTemp(); /析构函数 /定义结点结构 struct node T data; /入栈元素 node* next; /指向下一结点的指针 ; void SetEmpty(); /置空堆栈 bool IsEmpty(); /判断堆栈是否为空 bool Push(T element); /压入堆栈 bool Pop(T& element);/弹出堆栈 private: node* top; ; 该类的成员函数实现如下: template void CLinkStackTemp :SetEmpty() /释放堆栈占用的内存 node* temp; while (top!=NULL) temp=top; top=top-next; delete temp; template bool CLinkStackTemp :IsEmpty() return (top=NULL); template bool CLinkStackTemp :Push(T element) node* temp=new node(); if (temp =NULL) return false ; temp-data=element; temp-next=top; top=temp; return true; template bool CLinkStackTemp :Pop(T& element) if ( IsEmpty() return false; node* q = top; element = top-data; top=top-next; delete q; return true; 与顺序栈的实现略有不同,链栈不必指定栈的容量,其大小可以是近似无限的。为了程 序的使用方便,我们同样可以加入一些增强的功能。 三、 通用堆栈类的使用 通用堆栈类的使用较为简单,堆栈类的实例就是一个可以方便使用的堆栈。对堆栈的操作 都是通过类的成员函数来实现的。使用的具体步骤如下: 1. 在要使用堆栈类的程序代码的文件开头包括模板类及其成员函数的定义。 2. 类的实例化,可声明成变量,也可以声明它的指针,如: CArrayStackTemp intStack; /生成一个长度为100的int型堆栈 /生成一个元素为Record型的堆栈,Record为自定义结构 CLinkStackTemp * RecordStack; RecordStack=new

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论