C++ 模板简介
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6.1
模板概述
模板是支持参数化程序设计的工具, 模板是支持参数化程序设计的工具, 实现参数的多态性 实现参数的多态性
将程序要处理的对象的类型参数化, 使程序可以处理不同类型的对象;
C++提供两种模板机制: C++提供两种模板机制:
•函数模板 函数模板 •类模板 类模板
6.2
函数模板
考虑求两参数之中大值函数: 考虑求两参数之中大值函数:max ( a , b ) 的不同类型,都有相同的处理形式: 对 a , b 的不同类型,都有相同的处理形式:
类模板
类型为T的数组数据 类型为 的数组数据
类定义
int类型数组 类型数组
类定义
string类型数组 类型数组
类定义
Box类型数组 类型数组
类定义
Employee*类型数组 类型数组
//安全整形数组 安全整形数组 class Array { public : Array ( int s ) ; ~ Array ( ) ; int& get ( int index); void set ( int index, int& value); int& operator[ ] (int index) ; Array& operator = (Array& rArr) ; friend ostream& operator<<(ostream& out, Array& a); protected : int size ; int * element ; };
模板类型不能提供Leabharlann Baidu类型的隐式转换
6.2.4 重载函数模板
寻找和使用最符合函数名和参数类型的函数; 寻找和使用最符合函数名和参数类型的函数; 寻找一个函数模板, 寻找一个函数模板,将其实例化产生一个匹 配的模板函数,若找到则调用它; 配的模板函数,若找到则调用它; 寻找可以通过类型转换进行参数匹配的函数; 寻找可以通过类型转换进行参数匹配的函数; 如果按以上步骤均未能找到匹配函数, 如果按以上步骤均未能找到匹配函数, 则调用错误。 则调用错误。 如果调用有多于一个的匹配选择, 如果调用有多于一个的匹配选择, 则调用匹配出现二义性。 则调用匹配出现二义性。
函数模板
return ( a > b ) ? a : b ;
int max ( int a , int b ); int max (char a[], char b[]); ……. Box max (Box a , Box b );
重载函数通常基于不同的 重载函数通常基于不同的 数据类型实现类似操作 数据类型实现类似操作; 类似操作
函数模板作业
排序法的函数模板
template <typename T > void Sort ( T *a , int size ) { T temp ; ….. void Sort ( int *array , int size ); //Sort<int> } void Sort ( double *array , int size ); //Sort<double> void Sort ( char * carray , int size ); //Sort<char> void Sort ( char *name[] , int size ); //Sort<char*> void Sort ( string * name , int size ); //Sort<string*> void Sort ( Box *boxes , int size ); //Sort<Box>
用普通函数
void main ( ) { Max(9.3, 0.5); Max(9, 5, 23) ; Max(‘a’,’b’,’c’); Max(1, ‘1’); Max(“lelele”,”hahaha”); }
重载函数模板
函数模板练习
编写交换两个数据的函数模板
template <class T> void Swap (T &x, T &y) template <typename Type > void Swap ( Type *a , Type *b )
int max ( int 函数模板 ) a , int b
编译器生成的 模板函数
{ return a > b ? a : b ; } char max ( char a , char b ) { return a > b ? a : b ; }
由实参类型实例化 a , double b ) double max ( double
程序执行时 max ( 9.3 , 0.5 匹配不同的版本
) is " << max ( 9.3 , 0.5 ) << endl ;
6.2.3 函数模板参数匹配
类型实参与类型形参必须严格匹配
template < typename T > T max ( T a , T b ) { return a > b ? a : b ; } int max ( int a , int b ) { return a > b ? a : b ; } max ( i1 , 显式指定模板类型参数 max<int> i 2) ; // max ( c1 , c2 ) ; 可以实现类型转换// max<char> max ( i , c ) ‘a’); max<int>(3, ; max<float>(f, d); max ( f , d ) ; max( str1, str2); max (b1, b2); // error // error // char str1[10],str2[10] //Box b1, b2;
代码复用
泛型编程(Generic Programming) 泛型编程( )
STL( Standard Template Library)
第6章 模板
6.1 6.2 模板概述 函数模板
6.3 类模板
6. 4 标准模板库
6.1 模板概述 模板概述(Templates)
若一个程序的功能是对某种特定的数据类型进行 处理,则可以将所处理的数据类型说明为参数, 处理,则可以将所处理的数据类型说明为参数,以 便在其他数据类型的情况下使用。 便在其他数据类型的情况下使用。 通过模板可以产生类或函数的集合, 通过模板可以产生类或函数的集合,使它们操作 不同的数据类型, 不同的数据类型,从而避免需要为每一种数据类型 产生一个单独的类或函数。 产生一个单独的类或函数。 泛型编程( 泛型编程(generic programming) ) 模板用于表达逻辑结构相同, 模板用于表达逻辑结构相同,但具体 数据元素类型不同的数据对象的通用行为。 数据元素类型不同的数据对象的通用行为。
例3 重载函数模板示例
template <typename T> T Max( const T a, const T b ) { return a>b ? a : b ; } T Max( const T a, const T b ) { return a>b ? a : b ; } template <typename T> 重载函数模板 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 a>b ? a ::b ;;}} return a>b ? a b
类型参数
typename T1 , typename T2 , …… , typename Tn class T , class T2 , …… , class Tn 或 template < typename1 T > template < class ElementType > template < typename T1, typename T2 >
对不同数据类型的操作完全相同, template 实现更为简洁方便; 用函数模板实现更为简洁方便 < typename T > T max ( T a , T b ) { return a > b ? a : b ; } C++提供的函数模板可定义一个对任何类型变量进 提供的函数模板可定义一个对任何类型变量进 提供的函数模板可定义一个对任何 行操作的函数,从而大大增强了函数设计的通用 行操作的函数,从而大大增强了函数设计的通用 性。
交换两个int型变量中的数据 交换两个int型变量中的数据 int 交换两个char型变量中的数据 交换两个char型变量中的数据 char 交换两个字符串
函数模板练习
编写一个对具有n个元素的数组 求最小值的程序 编写一个对具有 个元素的数组a[ ]求最小值的程序, 个元素的数组 求最小值的程序, 要求将求最小值的函数设计成函数模板。 要求将求最小值的函数设计成函数模板。 template <typename T> T min(T a[ ],int n) { T min=a[0]; for( int i=1;i<n;i++) if(min>a[i]) min = a[i]; return min; }
return ( a > b ) ? a : b ;
用已有方法解决对不同数据类型处理: 用已有方法解决对不同数据类型处理: (1)宏替换 )
问题
(2)重载 )
# define max ( a , b ) ( a > b ? a : b) ) 避开类型检查
问题 需要许多重载版本
(3)使用函数模板 )
6.2
{ return a > b ? a : b ; }
{ cout << " max ( 3 , 5 ) is " << max ( 3 , 5 ) << endl ; cout << " max ( 'y' , 'e' ) is " << max ( 'y' , 'e' ) << endl ; cout << " }
template < typename T > T max ( T a[] , int n )
例1 简单函数模板应用
#include <iostream.h> template < typename T > T max ( T a , T b ) { return a > b ? a : b ; } void main ( )
6.2.2
函数模板定义
template < typename T > T max ( T a , T b ) { return a > b ? a : b ; }
template < 类型形式参数表 >
类型 函数名 ( 形式参数表 )
{
语句序列
}
函数模板定义由模板说明和函数定义组成。 模板说明的类型参数必须在函数首部中至少出现一次 函数参数表中也可以使用一般类型参数. 函数参数表中也可以使用一般类型参数
模板
函数模板
类模板
模板 函数
模板 类 对象
6.3
类模板
类模板实际上是函数模板的推广。 类模板实际上是函数模板的推广。 类模板用于实现类 所需数据的类型参数化 类模板主要用于数据存储(容器) 类模板主要用于数据存储(容器)类。 类模板在表示数据结构如数组、表、图等显得特别重要, 他们表示和算法不受所包含的元素类型的影响。
6.2.1 模板说明
template < typename T > T max ( T a , T b ) { return a > b ? a : b ; }
声明模板中使用的类型参数。形式: 声明模板中使用的类型参数。形式: 类型参数 template < 类型形式参数表 >
类型形式参数的形式为:
函数模板作业
1. 用函数模板方式设计一个函数模板 用函数模板方式设计一个函数模板sort<T>, , 采用插入排序方式对数据进行排序 可对整数序列、字符序列进行排序。 可对整数序列、字符序列进行排序。 可对盒子数组、 可对盒子数组、字符串数组进行排序。 2.设计函数模板实现折半查找算法 设计函数模板实现折半查找算法binSearch<T> 设计函数模板实现折半查找算法 在大小为n的数组 中查找值为Key的元素 的数组arr中查找值为 在大小为 的数组 中查找值为 的元素 返回查找结果(找到为下标,没找到-1) 返回查找结果(找到为下标,没找到 ) int binSearch( T arr[], int n, T key)