- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
6.5 模板与算法
C++程序设计(第2版); 模板是建立通用的与数据类型无关的算法的重要手段,在学习与数据结构相关的表、排序与查找的知识和算法时,要逐步熟悉函数模板和类模板的编程方法。 ;6.1 模板 ;6.1.1 函数模板及应用 ;template typename Groap
Groap max(const Groap *r_array,int size){
Groap max_val=r_array[0];
for (int i=1;isize; ++i)
if(r_array[i]ax_val) max_val=r_array[i];
return max_val; }
类型参数Groap 表示max()的返回类型,参数r_array 的类型,以及局部变量max_val 的类型。
在程序运行中,Groap会被各种内置(基本)类型或用户定义类型所置换。
模板参数表的使用与函数形式参数表的使用相同,都是位置对应。类型和值的置换过程称为模板实例化 (template instantiation)。 形参size 表示 r_array 数组的长度。; 函数模板根据一组实际类型或(和)值构造出独立的函数的过程通常是隐式发生的,称为模板实参推演(template argument deduction)。
下面完成【例6.1】
int ia[5]={10,7,14,3,25};
double da[6]={10.2,7.1,14.5,3.2,25.6,16.8};
string sa[5]={上海,北京,沈阳,广州,武汉};
int main() {
int i=max(ia,5);cout 整数最大值为:iendl;
double d=max(da,6);cout 实数最大值为:dendl;
string s=max(sa,5);cout 字典排序最大为:sendl;
return 0;
}; 第一次调用时,Glorp被int取代。第二次调用,Groap 被double取代。第三次Groap 被string取代。为了判断用作模板实参的实际类型,编译器需检查函数调用中提供的函数实参的类型。ia 的类型为int 数组,id的类型为double 数组。都被用来决定每个实例的模板参数。该过程称为模板实参推演。;请注意:与函数声明不同,函数模板的声明必须含变量名。因为两者编译过程不一样,函数模板必须先转换为模板函数。
template typename T1,typename T2
void inverse(T1 *mat1, T2 *mat2,int a,int b);
template typename T1,typename T2
void multi(T1 *mat1,T2 *mat2,T2 *result,int a, int b,int c);
template typename T
void output(T *mat,char*s,int a,int b);
注意:mat2和result属同一类型,均为由具有相同元素数量的一维数组所组成的二维数组。本例为mat[3][4]和result[6][4]。记住数组最高维是不检查边界的。;6.1.2 类模板与线性表; 模板非类型参数由一个普通的参数声明构成。表示该参数名代表了一个潜在的常量,企图修改这种参数的值是一个错误。如数组类模板,可以有一个数组长度的非类型参数:
template typename T,int iclass array{
T vector[i]; int size;
public:
array( ):size(i){} //等效array( ){size=i;}参见4.4.3节
... ...};
从通用的类模板定义中生成类的过程称为模板实例化(template instantiation),其格式为:
类名类模板实参表 对象名; ;注意:在类外定义的类模板中的成员函数必须是函数模板。这样的成员函数只有在被调用(或取地址)时才被实例化。成员函数模板定义中,指定成员函数所在类域的类型名后跟的模板参数名表中成员,与类模板的模板参数表中的类型参数名相同,但不加 typename 或class。; 线性表是数据结构中的概念。数组中除第一个元素外,其他元素有且仅有一个直接前驱,第一个元素没有前驱;除最后一个元素外,其他元素有且仅有一个直接后继,最后一个元素无后继。这样的特性称为线性关系。所议称数组元素在一个线性表中。线性表实际包括顺序表(数组)和链表。; 这些操作与数组封装在一起可以定义一个类,考虑到数组元素的类型可以各不相同,所以定义为类模板。
现在所定义的数组称为静
文档评论(0)