《模板是C支持参数化多态的工具使用模板可以使用户为类.ppt》由会员分享,可在线阅读,更多相关《模板是C支持参数化多态的工具使用模板可以使用户为类.ppt(16页珍藏版)》请在三一办公上搜索。
1、模板是C+支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。C+的标准模板库STL(Standard Template Library)已经成为一个标准,它包含容器,算法以及迭代子(或称迭代器)。本章首先探讨函数模板和类模板,然后介绍C+标准模板库的使用。,函数模板的语法形式如下:template 函数定义,10.1 函数模板,利用函数模板,可以建立一个具有通用功能的函数,支持不同的函数参数和返回值,达到减少代码书写量的目的。,template T abs(T value)return value0?value:
2、-value;,int main()int nValue=-1,nResult;double dblValue=-1.2,dblResult;nResult=abs(nValue);dblResult=abs(dblValue);coutnValue nResultendl;coutdblValue dblResultendl;return 0;,在主程序中可以这样使用函数模板:,例如重载函数,求绝对值的函数只要声明一个函数模板:,-1 1-1.2 1.2,C+语言中的类模板的语法定义如下:Template 类声明,当模板参数表中同时包含上述多项内容时,各项内容之间以逗号隔开。,使用模板类来产
3、生对象时,按如下形式声明:模板 对象名1,.对象名n;,10.2 类模板,数据成员变成另外一种数据类型,或者干脆是一个类的对象,又要重新拷贝,重新进行修改。这样不仅程序的代码数量急剧增加,修改过程中也很容易出现各种疏漏。用一种类似函数模板的机制来结决问题类模板。,与函数模板相同,类模板只有使用的时候才被具体化为某一种类型。,例 10-2,/类模板的实现#ifndef EXAMPLE10_02B_H#define EXAMPLE10_02B_Htemplate T Max:Max(T the first,T thesecond,T thethird):item1(thefirst),item2(
4、thesecond),item3(thethird)return;template void Max:SetItem(T thefirst,T thesecond,T thethird)item1=thefirst;item2=thesecond;item3=thethird;template T Max:GetMaxItem(),(续),T maxitem;maxitem=item1item2?item1:item2;maxitem=maxitemitem3?maxitem:item3;return maxitem;#endif/EXAMPLE10_2.CPP/主程序#include#inc
5、lude EXAMPLE1002.H#include EXAMPLE1002B.Hint main()Max nmyMax(1,2,3);Max dblmyMax(1.2,1.3,-1.4);coutnmyMax.GetMaxItem()endl;coutdblmyMax.GetMaxItem()endl;return 0;,/EXAMPLE10_03.CPP/源程序开始#include#include template class CStack/模板名public:CStack(int size_t=10);/构造函数模板CStack();/析构函数模板bool Empty()const;/
6、栈空判断bool Full()const;/栈满判断void Clear();/清空栈T,例 10-3,(续),T*ptrStack;template CStack:CStack(int size_t)/构造函数模板if(size_t0)size=size_t;else size=10;top=-1;ptrStack=new Tsize;template CStack:CStack()/析构函数模板delete ptrStack;template bool CStack:Empty()const/栈空判断return top=-1;,(续),template bool CStack:Full(
7、)const/栈满判断return top=size-1;template Ttemplate void CStack:Push(const T&value)/入栈if(!Full(),(续),ptrStack+top=value;else exit(1);template T,(续),for(i=0;itemp;dblStack.Push(temp);/入栈 while(!dblStack.Empty()temp=dblStack.Pop();/出栈cout tempendl;return 0;,程序运行结果:,Push elements 0 in stack:11.11Push eleme
8、nts 1 in stack:22.22Push elements 2 in stack:33.33Push elements 3 in stack:44.44Push elements 4 in stack:55.55-55.55-44.44-33.33-22.22-11.11,【基本数据结构知识】,【标准模板库】,若干个固定事物的全体叫做一个集合,组成集合的事物叫做这个集合的元素。例如对于一个有四个元素的集合A可以如下表示:A=a1,a2,a3,a4,C+的标准模板库STL包含容器、算法和迭代子,其中容器模板包括链表、向量、栈、队列、集合、映象等,算法模板包括诸如排序、查找等各种算法,而迭
9、代子则可以针对不同容器进行操作。本章将着重介绍STL的使用。,实现了数组、链表、线性表、栈和队列,它们属于线性容器。另外,这里还将使用到双端队列,就是两端都可以进行插入和删除操作的线性表。除了线性容器,我们还将接触到两种非线性容器:集合和映射。,日常生活中也存在大量映射的例子,如一个身份证号码可以映射为某个确定的人,图书馆中一本书的编号和这本书也是一个映射。,例如两个集合A和B:A=1,2,3,4 B=a,b,c,d,我们可以构造从集合A到集合B的映射(1,a),(2,b),(3,d),(4,c)等等。,子集:如果一个集合A的所有元素都是另一个集合B的元素,则集合A是集合B的子集。交集:取集合
10、A和集合B中所有相同元素组成的集合 差集:集合A对集合B的差集可以定义为由所有属于集合A但不属于 集合B的元素组成的集合。,映射则是把一个集合中的元素和另一个集合中的元素联系起来。,STL中的容器类是基于模板的,它既包含线性容器,也包含非线性容器,其中主要有:vector(向量模板)list(链表模板)stack(栈模板)queue(队列模板)deque(双端队列模板)set(集合模板)map(映射模板),【标准模板类库简介】,1994年7月,STL正式成为标准C+库的一部分。,STL的迭代子可以看成是指针的推广,迭代子也可以是普通的指针。,排序(sort、merge)查找(find、sear
11、ch)比较(equal)集合(includes、setunion、setdifference)计算(accumulate、partialsum)统计(max、min)管理(swap、fill、replace、copy、unique、rotate、reverse)堆操作(makeheap、pushheap、popheap、sortheap),STL的主要算法有:,STL的算法是用函数模板实现的,可以实现对不同类型对象的通用操作。,算法与STL容器类之间是通过迭代子来进行沟通的,算法面向迭代子,迭代子则面向容器类,对于迭代子,可以将它理解为一个指针,通过它我们可以获得容器内部的数据对象,然后算法对这个由迭代子获得的对象进行操作。,