




已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
STL( Standard Template Library),泛型编程(Generic Programming),代码复用,第6章 模板,6.1 模板概述,6.2 函数模板,6.3 类模板,6. 4 标准模板库,若一个程序的功能是对某种特定的数据类型进行处理,则可以将所处理的数据类型说明为参数,以便在其他数据类型的情况下使用。,6.1 模板概述(Templates),通过模板可以产生类或函数的集合,使它们操作不同的数据类型,从而避免需要为每一种数据类型产生一个单独的类或函数。,泛型编程(generic programming) 模板用于表达逻辑结构相同,但具体 数据元素类型不同的数据对象的通用行为。,6.1 模板概述,模板是支持参数化程序设计的工具, 实现参数的多态性 将程序要处理的对象的类型参数化, 使程序可以处理不同类型的对象;,C+提供两种模板机制: 函数模板 类模板,6.2 函数模板,考虑求两参数之中大值函数:max ( a , b ) 对 a , b 的不同类型,都有相同的处理形式: return ( a b ) ? a : b ;,用已有方法解决对不同数据类型处理:,(1)宏替换 # define max ( a , b ) ( a b ? a : b) 问题 避开类型检查,(2)重载 问题 需要许多重载版本,(3)使用函数模板,6.2 函数模板,重载函数通常基于不同的 数据类型实现类似操作; 对不同数据类型的操作完全相同, 用函数模板实现更为简洁方便; C+提供的函数模板可定义一个对任何类型变量进行操作的函数,从而大大增强了函数设计的通用性。,int max ( int a , int b ); int max (char a, char b); . Box max (Box a , Box b );,template T max ( T a , T b ) return a b ? a : b ; ,return ( a b ) ? a : b ;,template ,声明模板中使用的类型参数。形式:,6.2.1 模板说明,类型形式参数的形式为: typename T1 , typename T2 , , typename Tn 或 class T1 , class T2 , , class Tn,类型参数,template template template ,template T max ( T a , T b ) return a b ? a : b ; ,template 类型 函数名 ( 形式参数表 ) 语句序列 ,函数模板定义由模板说明和函数定义组成。 模板说明的类型参数必须在函数首部中至少出现一次 函数参数表中也可以使用一般类型参数. template T max ( T a , int n ),6.2.2 函数模板定义,template T max ( T a , T b ) return a b ? a : b ; ,#include template T max ( T a , T b ) return a b ? a : b ; void main ( ) cout “ max ( 3 , 5 ) is “ max ( 3 , 5 ) endl ; cout “ max ( y , e ) is “ max ( y , e ) endl ; cout “ max ( 9.3 , 0.5 ) is “ max ( 9.3 , 0.5 ) endl ; ,例1 简单函数模板应用,函数模板,int max ( int a , int b ) return a b ? a : b ; ,由实参类型实例化,char max ( char a , char b ) return a b ? a : b ; ,double max ( double a , double b ) return a b ? a : b ; ,编译器生成的 模板函数,程序执行时 匹配不同的版本,类型实参与类型形参必须严格匹配 template T max ( T a , T b ) return a b ? a : b ; ,6.2.3 函数模板参数匹配,max ( i1 , i 2) ; / max max ( c1 , c2 ) ; / max max ( i , c ) ; / error max ( f , d ) ; / error max( str1, str2); / char str110,str210 max (b1, b2); /Box b1, b2;,模板类型不能提供 类型的隐式转换,显式指定模板类型参数 可以实现类型转换,max(3, a); max(f, d);,int max ( int a , int b ) return a b ? a : b ; ,寻找和使用最符合函数名和参数类型的函数; 寻找一个函数模板,将其实例化产生一个匹 配的模板函数,若找到则调用它; 寻找可以通过类型转换进行参数匹配的函数; 如果按以上步骤均未能找到匹配函数, 则调用错误。 如果调用有多于一个的匹配选择, 则调用匹配出现二义性。,6.2.4 重载函数模板,template T Max( const T a, const T b ) return ab ? a : b ; template T Max( const T a, const T b , const T c) T t ; t = Max(a, b) ; return Max ( t, c ) ; int Max( const int a , const char b ) return ab ? a : b ; void main ( ) Max(9.3, 0.5); Max(9, 5, 23) ; Max(a,b,c); Max(1, 1); Max(“lelele”,”hahaha”); ,例3 重载函数模板示例,int Max( const int a , const char b ) return ab ? a : b ; ,template T Max( const T a, const T b , const T c) T t ; t = Max(a, b) ; return Max ( t, c ) ; ,template T Max( const T a, const T b ) return ab ? a : b ; ,重载函数模板,用普通函数 重载函数模板,函数模板练习,template void Swap (T &x, T &y) template void Swap ( Type *a , Type *b ),编写交换两个数据的函数模板,交换两个int型变量中的数据 交换两个char型变量中的数据 交换两个字符串,函数模板练习,template T min(T a ,int n) T min=a0; for( int i=1;iai) min = ai; return min; ,编写一个对具有n个元素的数组a 求最小值的程序,要求将求最小值的函数设计成函数模板。,函数模板作业,template void Sort ( T *a , int size ) T temp ; ,排序法的函数模板,void Sort ( int *array , int size ); /Sort void Sort ( double *array , int size ); /Sort void Sort ( char * carray , int size ); /Sort void Sort ( char *name , int size ); /Sort void Sort ( string * name , int size ); /Sort void Sort ( Box *boxes , int size ); /Sort,函数模板作业,1. 用函数模板方式设计一个函数模板sort, 采用插入排序方式对数据进行排序 可对整数序列、字符序列进行排序。 可对盒子数组、字符串数组进行排序。 2.设计函数模板实现折半查找算法binSearch 在大小为n的数组arr中查找值为Key的元素 返回查找结果(找到为下标,没找到-1) int binSearch( T arr, int n, T key),模板,函数模板,类模板,对象,模板 函数,模板 类,类模板实际上是函数模板的推广。 类模板用于实现类 所需数据的类型参数化 类模板主要用于数据存储(容器)类。 类模板在表示数据结构如数组、表、图等显得特别重要, 他们表示和算法不受所包含的元素类型的影响。,6.3 类模板,类模板 类型为T的数组数据,类定义 int类型数组,类定义 string类型数组,类定义 Box类型数组,类定义 Employee*类型数组,/安全整形数组 class Array public : Array ( int s ) ; Array ( ) ; int,template class Array public : Array ( int s ) ; Array () ; const T,例4 一个数组类模板,数据成员是T 类型指针,类模板由模板说明和类说明构成,template 类声明,例如,template class TClass public: / TClass的成员函数 private : Type DateMember ; / ;,类属参数必须至少 在类说明中出现一次,6.3.1 类模板与模板类,类模板的声明与定义,template class 类名 /类说明 ; template 返回类型 类名 类型名: 成员函数1 (形参表) /成员函数定义体 。 template 返回类型 类名 类型名: 成员函数n (形参表) /成员函数定义体 ,类模板的成员函数是函数模板,Array,template Array :Array (int s) size = (s 1 ) ? s : 1 ; element = new T size ; template Array : Array() delete element ; template const T ,例4 一个数组类模板,template class Array public : Array ( int s ) ; virtual Array () ; virtual const T,#include #include “Array.h“ void main() Array IntAry( 5 ) ; for (int i = 0; i DouAry( 5 ) ; for ( i = 0; i 5; i + ) DouAry.set ( i, (i+1)*0.35 ) ; cout “Double Array : n“ ; for ( i = 0; i 5; i + ) cout DouAry.get(i) t ; coutendl; ,例4 一个数组类模板,class Array public : const int ,class Array public : const double ,使用类模板的方法 (1).在程序开始或头文件中说明类模板 的定义。 (2).在适当的地方创建一个模板类 的实例, 即一个模板类定义,同时创建该 模板类对象。 (3). 使用对象调用成员函数。 其实参类型与模板类规定的类型一致。,6.3.1 类模板与模板类, ;,template class . ;,函数的形式参数类型可以是类模板 或类模板的引用, 实参为该类模板实例化的模板类对象. 当一个函数拥有类模板参数时, 这个函数必定是函数模板 .,6.3.2 类模板作函数参数,template void Array :operator=( const Array ,一个用 Array 作参数的函数模板,6.3.2 类模板作函数参数,注意: 模板的声明和定义必须在同一文件中, 否则产生连接错误!,一个类模板在类层次结构中 既可以是基类也可以是派生类: 类模板可以从模板类派生 类模板可以从非模板类派生 模板类可以从类模板派生 非模板类可以从类模板派生,6.3.3 类模板与继承,template class Array public : Array ( int s ) ; virtual Array () ; virtual T,从类模板Array派生一个安全数组类模板BoundArray,6.3.3 类模板与继承,template class Array,template class BoundArray : public Array public : BoundArray ( int low = 0, int height = 1 ) ; T,从类模板Array派生一个安全数组类模板BoundArray,6.3.3 类模板与继承,作业,1.编写并使用安全数组类模板BoundArray,要求: 1)从数组类模板Array派生而来: 2)包括对数组进行排序和查找的方法。 3)重载、, BoundArray, BoundArray和BoundArray,作业,2。用类模板方式设计一个栈类stack,其中数据存储结构用动态数组实现,类中包含两个私有数据成员:T* s(存放栈元素)和top(栈顶元素下标),至少包含3个公有成员函数:push(元素入栈)、pop(元素出栈)和stackempty(判断栈是否为空),并建立一个整数栈,一个字符栈和学生栈测试模板。,链表-结构体1,struct Stu int num; string name; double score; Stu * next; ; Stu* Create( ); / 创建链表 void Add( Stu / 删除链表,链表类2,class Stu; class StuNode public: StuNode( ); StuNode( ); void print(); static StuNode *pHead; static int count; private: Stu s; StuNode* pnext; ,StuNode* Create( ); void Delete( ); void Add( StuNode,链表类3,class Stu; class StuNode /节点类 public: StuNode( ); StuNode( ); void print() const; StuNode* nextNode( )const; void insertAfter( StuNode ,/链表类 class StuList public: StuList( ); StuList( ); void creat( ); void delete( ); void Add( Stu ,链表类模板4,template class Node / 结点类模板 public: Node* pNext; T data ; Node( const T,链表类模板4,template class List public: List( ); List( ); void Add( Node,6.4 标准模板库(STL) (Standard Template Library),STL包括: 容器、迭代器、算法等,6.4.1 容器(container),容器是存储数据的一种方式 容器分类: 顺序容器 关联容器和容器适配器 顺序容器: vector
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江省泰顺县2025年上半年事业单位公开遴选试题含答案分析
- 浙江省三门县2025年上半年事业单位公开遴选试题含答案分析
- 云南省德钦县2025年上半年事业单位公开遴选试题含答案分析
- 七年级下册英语单词表朗读 全部单元
- 河北省迁安市2025年上半年公开招聘辅警试题含答案分析
- 河北省灵寿县2025年上半年公开招聘城市协管员试题含答案分析
- 2025年度社保缴纳及企业职工企业补充意外伤害保险合同范本
- 2025年船员薪资待遇与晋升合同条款
- 2025版企业品牌形象设计与传播服务合同
- 2025年度绿色建筑房地产项目销售包销合同协议书
- 柏拉图教育思想体系解析
- 奶茶线上活动方案
- 军训医疗知识培训
- 公司适用法律法规标准清单2025年08月更新
- 透视高考政治真题研究山东高考政治命题特点
- 2025年中国萝卜干市场调查研究报告
- 牙周疾病治疗沟通讲课件
- 患者的入院护理课件
- 聚磷酸铵阻燃剂市场分析报告
- 香港公司章程范本中文
- 数据治理与合规性试题及答案
评论
0/150
提交评论