您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 模板和STL-C++程序设计
张华模板和STL2008年02月张华武汉大学2模板与STL引例模板函数模板类模板STL容器迭代器算法通用程序设计C++语言程序设计2008年02月张华武汉大学3引例问题定义函数max()求两个相同数据类型的数中的大数。两个数的类型可以是字符、整数、双精度浮点数。分析与设计找出两个字符中的较大值:针对不同类型的参数定义函数max()的多个重载版本。模板与STLcharmax(chara,charb){return(a=b)?a:b;}2008年02月张华武汉大学4引例实现源代码(cw1401)模板与STL#includeiostream.hcharmax(chara,charb){return(a=b)?a:b;}intmax(inta,intb){return(a=b)?a:b;}doublemax(doublea,doubleb){return(a=b)?a:b;}2008年02月张华武汉大学5引例实现源代码模板与STLvoidmain(){charca='n',cb='s';coutmax(ca,cb)endl;intia=3,ib=5;coutmax(ia,ib)endl;doubleda=8.2,db=5.4;coutmax(da,db)endl;}s58.22008年02月张华武汉大学6引例思考能不能只定义一个max()函数?模板与STLcharmax(chara,charb){return(a=b)?a:b;}intmax(inta,intb){return(a=b)?a:b;}doublemax(doublea,doubleb){return(a=b)?a:b;}Temp_Typemax(Temp_Typea,Temp_Typeb){return(a=b)?a:b;}就像用同一个模子做出来的!C++可以定义函数模板!2008年02月张华武汉大学7引例函数模板定义一个函数模板:max()。(cw1402)模板与STL#includeiostream.htemplateclassTTmax(Ta,Tb){return(a=b)?a:b;}voidmain(){charca='n',cb='s';coutmax(ca,cb)endl;intia=3,ib=5;coutmax(ia,ib)endl;doubleda=8.2,db=5.4;coutmax(da,db)endl;}s58.2这就是函数模板max()!2008年02月张华武汉大学8函数模板函数模板的定义用来实现从一个模板生成多个函数。定义函数模板的格式:类型参数:class参数class表示该形式参数接收一个类型名称,实现类型参数化。举例模板与STLtemplate类型形式参数表函数返回值类型函数模板名(形式参数表){函数体}templateclassTTmax(Ta,Tb){return(a=b)?a:b;}包括类型参数和非类型参数2008年02月张华武汉大学9函数模板函数模板的定义定义函数模板的格式:非类型参数:类型说明符参数这种形式参数只能接收一个常量。举例模板与STLtemplate类型形式参数表函数返回值类型函数模板名(形式参数表){函数体}templateclassT,intNvoidInitList(T*a,Tb){for(inti=0;iN;i++)a[i]=b;}2008年02月张华武汉大学10函数模板函数模板的使用函数模板的实例化,编译器根据函数模板生成模板函数。模板与STLtemplateclassTTmax(Ta,Tb){return(a=b)?a:b;}voidmain(){charca='n',cb='s';coutmax(ca,cb)endl;intia=3,ib=5;coutmax(ia,ib)endl;doubleda=8.2,db=5.4;coutmax(da,db)endl;}charmax(chara,charb){return(a=b)?a:b;}intmax(inta,intb){return(a=b)?a:b;}doublemax(doublea,doubleb){return(a=b)?a:b;}函数模板实例化2008年02月张华武汉大学11函数模板函数模板的使用模板函数的名称。(cw1403)模板与STLtemplateclassTTmax(Ta,Tb){return(a=b)?a:b;}voidmain(){charca='n',cb='s';coutmaxchar(ca,cb)endl;intia=3,ib=5;coutmaxint(ia,ib)endl;doubleda=8.2,db=5.4;coutmaxdouble(da,db)endl;}这是模板函数的名称。如果编译器可以推导出T,则T可以不写出来。2008年02月张华武汉大学12函数模板案例分析:函数模板的使用定义两个函数模板,分别初始化和显示不同类型的数组。(cw1404)模板与STL#includeiostream.htemplateclassT,intNvoidInitList(T*a,Tb){for(inti=0;iN;i++)a[i]=b;}templateclassTvoidShowList(T*a,intN){for(inti=0;iN;i++)couta[i]endl;}voidmain(){/*const*/intn=5;charca[5];InitListchar,n(ca,'a');ShowList(ca,5);coutendl;intia[10];InitListint,10(ia,9);ShowListint(ia,10);}编译器无法推导出N。2008年02月张华武汉大学13类模板类模板的定义定义类模板的格式:举例模板与STLtemplate类型形式参数表class类模板名{…/*类定义体*/…};templateclassT,intNclassAClass{…};2008年02月张华武汉大学14类模板类模板的成员函数的定义可以放在类模板的定义体中,其格式与普通类中成员函数的定义格式相同。也可以在全局区域中定义,其格式如下:举例模板与STLtemplate类型形式参数表函数返回值类型类模板名类型名表::成员函数名(形参表){函数体}templateclassT,intNvoidAClassT,N::Show(){for(inti=0;iN;i++)coutvalues[i+1]=values[i]endl;}2008年02月张华武汉大学15类模板类模板的说明类模板不是具体的类,只是对类的描述。要根据类模板定义对象必须分两步走:类模板实例化生成类,即模板类模板类实例化得到对象举例模板与STL类模板名实参表对象名;AClassint,5a1;2008年02月张华武汉大学16类模板案例分析:类模板定义类模板AClass,包含两个成员函数。(cw1405)模板与STL#includeiostream.htemplateclassT,intNclassAClass{private:Tvalues[N];public:voidSet(intx){for(inti=0;iN;i++)values[i]=x+i;}voidShow();};2008年02月张华武汉大学17类模板案例分析:类模板测试模板与STLtemplateclassT,intNvoidAClassT,N::Show(){for(inti=0;iN;i++)coutvalues[i+1]=values[i]endl;}voidmain(){AClassint,5a1;a1.Set(2);a1.Show();AClassdouble,10a2;a2.Set(10);a2.Show();}values[1]=2values[2]=3values[3]=4values[4]=5values[5]=6values[1]=10values[2]=11values[3]=12values[4]=13values[5]=14values[6]=15values[7]=16values[8]=17values[9]=18values[10]=192008年02月张华武汉大学18模板小结程序设计中遇到若干个程序结构有同一种模式时就可以使用模板。模板是一种高度抽象的结构形式。函数模板是一类函数的抽象,代表了一类函数。这些函数具有相同的功能,但返回值和/或形参的类型可能不同。模板函数是一个具体的函数,可以被调用。类模板是对类的抽象,代表一类类。这些类具有相同的功能,但数据成员的类型、成员函数的返回值和/或形参的类型可能不同。模板类是类模板的实例,是一个具体的类,可以实例化。模板与STL2008年02月张华武汉大学19STL标准模板库(StandardTemplateLibrary,STL)是C++标准库的重要组成部分。主要包括三部分内容:容器(container)迭代器(iterator)算法(algorithm)体现了通用(范型)程序设计(GenericProgramming)的思想。模板与STL2008年02月张华武汉大学20容器容器是指一种存储了有限个同类型数据元素的数据结构。7个基本容器:模板与STL名称描述所在头文件vector向量,连续存储的元素。vectordeque双端队列,连续存储的指向不同元素的指针所组成的元素。dequelist列表,由节点组成的双向链表,每个节点包含一个元素。listset集合,由节点组成的红黑树,每个节点包含一个元素,节点之间以某种作用于元素对的谓词排列,两个不同元素不能有相同的次序。setmultiset和set基本相同,但允许存在两个次序相同的元素存在。multisetmap由{键,值}对组成的集合,以某种作用于键对上的谓词排列。mapmultimap允许键对有相同的次序,即一个键可以对应多个值。multimap2008年02月张华武汉大学21容器容器顺序容器将元素按照严格的线性形式组织起来对元素的访问可以采用顺序方式或随机方式包括vector、list、deque关联容器将元素按照非线性形式组织起来根据一组索引来快速的访问元素包括set、multiset、map、multimap模板与STL2008年02月张华武汉大学22容器vector内部用动态数组来存放元素,长度可变。是一个类模板,元素类型任意。常用的成员函数vector()–创建一个长度为0的空向量vector(size_typen,constT&val=T())–创建一个长度为n的向量,每个元素的初始值为val。size_typesize()const–返回当前容器中元素的个数size_typecapacity()const–返回容器当前可存放元素的个数模板与STL2008年02月张华武汉大学23容器vector常用的成员函数boolempty()–如果容器为空则返回true,否则返回falsevoidpush_back(constT&x)–在容器末尾添加元素x。voidclear()–删除容器中的全部元素voidreserve(size_typen)–重新分配内容,使其可存放n个元素模板与STL2008年02月张华武汉大学24容器案例分析:vector的使用创建两个vector,分别保存5个整数和浮点数。(cw1406)模板与STL#includeiostream#includevectorusingnamespacestd;voidmain(){inti;vec
本文标题:模板和STL-C++程序设计
链接地址:https://www.777doc.com/doc-3999046 .html