自整理C++简明教程模板.docx
- 文档编号:3792361
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:17
- 大小:21.01KB
自整理C++简明教程模板.docx
《自整理C++简明教程模板.docx》由会员分享,可在线阅读,更多相关《自整理C++简明教程模板.docx(17页珍藏版)》请在冰豆网上搜索。
自整理C++简明教程模板
#include
usingnamespacestd;
/*
函数模板可以用来创建一个具有通用功能的函数,以支持多种不同的形参,简化重载函数的设计。
函数模板定义如下:
template<模板参数表>返回类型函数名(形式参数表){。
。
。
}
类模板的定义如下:
template<模板参数表>class类名{
...//类定义体
};
template<模板参数表>返回类型类名<模板参数名表>:
:
成员函数名1(形参表){
...//成员函数定义体
}
。
。
。
template<模板参数表>返回类型类名<模板参数名表>:
:
成员函数名n(形参表){
...//成员函数n定义体
}
注意:
在成员函数模板的定义中,指定成员函数所在类域的类名后跟的“模板参数名表”中的成员与类模板的“模板参数表”中的类型参数名相同,但不加typenameorclass
因为与包含对象成员的构造函数类似,“模板参数名表”实际上是一个模板实例化的类型实参表,所以不加typenameorclass
*/
template
Tslist[size];//存放顺序表的数组
intMaxsize;//最大可容纳项数
intlast;//已存表项的最后位置
public:
seqlist(){last=-1;Maxsize=size;}//初始化为空表
intLength()const{returnlast+1;}//计算表的长度
intFind(T&x)const;//寻找x在表中的位置(下标)
boolIsIn(T&x);//判断x是否在表中
boolInsert(T&x,inti);//x插入到列表中的第i个位置处(下标)
boolRemove(T&x);//删除x
intNext(T&x);//寻找x的后继位置
intPrior(T&x);//寻找x的前驱位置
boolIsEmpty(){returnlast==-1;}//判断表是否为空表
boolIsFull(){returnlast==Maxsize-1;}//判断表是否为满
TGet(inti){
if(i<0||i>last)exit
(1);
elsereturnslist[i];
}//取第i个元素的值
/*
运算符重载的一般格式:
返回值类型类名:
:
operator重载运算符(参数表){。
。
。
}
*/
T&operator[](inti);//重载下标运算符“[]”
};
template
:
Find(T&x)const{
//注意格式,const表示该函数的this指针为const,即被访问对象的数据不能被修改
//如果被修改,则编译器会警告,防止编程时失误
inti=0;
while(i<=last&&slist[i]!
=x)//顺序查找是否有x
i++;
if(i>last)return-1;//未找到,返回-1;
elsereturni;//找到,返回下标
}
template
:
IsIn(T&x){//形式参数为引用,返回值为布尔型
inti=0;
boolfound=0;
while(i<=last&&!
found)
if(slist[i]!
=x)
i++;
elsefound=1;//找到返回1
returnfound;
}
/*
当执行插入操作时,注意元素插入位置
*/
template
:
Insert(T&x,inti){
intj;
if(i<0||i>last+1||last==Maxsize-1)//插入位置不合理,不能插入(稳健性)
returnfalse;
else{
last++;
for(j=last;j>i;j--)
slist[j]=slist[j-1];//从表的最后位置向前依次后移,空出指定的位置供元素插入
slist[i]=x;
returntrue;
}
}
template
:
Remove(T&x){
inti=Find(x),j;//先找到x元素的位置
if(i>=0){
last--;
for(j=i;j<=last;j++)
slist[j]=slist[j+1];//依次前移,保证表连续
returntrue;
}
returnfalse;//表中不存在x
}
template
:
Next(T&x){
inti=Find(x);
if(i>=0&&i returni+1;//x的后继位置 elsereturn-1;//x不在表中或在表的末尾 } template : Prior(T&x){ inti=Find(x); if(i>0&&i<=last) returni-1;//x的前驱位置 elsereturn-1; } template : operator[](inti){ if(i>last+1||i<0||i>=Maxsize){ cout<<"下标出界! "< exit (1);//下标出界则推出函数 } if(i>last) last++; returnslist[i];//下标运算符“[]”只能增加表的元素,不能减少 } intmain(){ seqlist inti,j,k,a[10]={2,3,5,7,11,13,17,19,23,29}; for(j=0;j<10;j++) if(! seqlisti.Insert(a[j],j)){ cout<<"表太大了放不下! "< break; } j=seqlisti.Length(); for(i=0;i cout< cout< for(j=0;j<10;j++) seqlisti[j]=0;//全部赋值为0,打印 for(j=0;j<10;j++) cout< cout< for(j=0;j<10;j++) seqlisti[j]=a[j]; seqlisti[10]=31;//将原来和新增元素都打印出来(实验能否新增元素) for(j=0;j<11;j++) cout< cout< k=7;//查看7在不在其中 if(seqlisti.IsIn(k))//因为形参是引用,所以实参不可以用常数7,对应的实参应该用k cout<<"素数7在顺序表中"< k=17; if(seqlisti.Remove(k))//删除素数17 cout<<"删除素数17"< elsecout<<"找不到素数17,无法删除"< j=seqlisti.Length(); for(i=0;i cout< cout< if(seqlisti.Insert(k,j-1)){//把素数17装回去,成功则打印 j=seqlisti.Length(); for(i=0;i cout< cout< } cout<<"打印17的后一个素数: "< cout<<"打印17的前一个素数: "< cout<<"素数17在表中的位置(下标)为: "< if(seqlisti.IsEmpty()) cout<<"表是空的"< elsecout<<"表不是空的"< if(seqlisti.IsFull()) cout<<"表是满的"< elsecout<<"表不是满的"< if(seqlisti.IsIn(k)) cout<<"素数17在表中"< return0; } /* 运行结果: 2357111317192329 0000000000 235711131719232931 素数7在顺序表中 删除素数17 2357111319232931 235711131923291731 打印17的后一个素数: 31 打印17的前一个素数: 29 素数17在表中的位置(下标)为: 9 表不是空的 表不是满的 素数17在表中 Pressanykeytocontinue */ #include #include usingnamespacestd; //泛函是函数的函数,那么函数模板是否可以理解为函数的函数根据不同参数实现不同函数 //函数模板,本例中是转置 template //函数模板,矩阵乘法 template //函数模板,矩阵输出 template intmain() { intmiddle[6][3]; intresult[6][4]; intmatrix1[3][6]={8,10,12,23,1,3,5,7,9,2,4,6,34,45,56,2,4,6}; intmatrix2[3][4]={3,2,1,0,-1,-2,9,8,7,6,5,4}; char*s1="result"; char*s2="middle"; inverse(matrix1,middle,6,3);//matrix1类型为6个元素的1维数组,middle类型为3个元素的1维数组,算类型时忽略最高维,二维的话按列来算。 转置将3行6列转置为6行3列。 //为了判断用作模板实参的实际类型,编译器需要检查函数调用中提供的函数实参的类型。 //上式的显式为: inverse multi(middle,matrix2,result,6,3,4);//middle有6个3维数组(6行3列),matrix2有3个4维数组(3行4列),result有6个4维数组,所以matrix2和result的类型是一样的 //显式: multi output(matrix1,"matrix1",3,6);//3行6列 output(middle,s2,6,3);//middle就是将matrix1转置,6行3列 output(matrix2,"matrix2",3,4);//matrix23行4列 output(result,s1,6,4);//result6行4列 return0; } //以下参数a为行,b为列 //为各种函数模板的定义 template inti,j; for(i=0;i for(j=0;j mat2[j][i]=mat1[i][j]; return; //return只是为了告诉我们这段程序完结了。 } template //二维数组的类型仅指其组成元素的类型(一维数组)。 如matrix2和result //是同一类型,其元素同为整形四元素一维数组,尽管前者只有三个元素,而后者有6个元素 inti,j,k;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 整理 C+ 简明 教程 模板