C++语言程序设计教程:第7章 模板

上传人:m**** 文档编号:569536916 上传时间:2024-07-30 格式:PPT 页数:37 大小:1.17MB
返回 下载 相关 举报
C++语言程序设计教程:第7章 模板_第1页
第1页 / 共37页
C++语言程序设计教程:第7章 模板_第2页
第2页 / 共37页
C++语言程序设计教程:第7章 模板_第3页
第3页 / 共37页
C++语言程序设计教程:第7章 模板_第4页
第4页 / 共37页
C++语言程序设计教程:第7章 模板_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《C++语言程序设计教程:第7章 模板》由会员分享,可在线阅读,更多相关《C++语言程序设计教程:第7章 模板(37页珍藏版)》请在金锄头文库上搜索。

1、第第7章章 模板模板C+语言程序设计教程语言程序设计教程大连理工大学软件学院大连理工大学软件学院第第7章章 模板模板大连理工大学软件学院大连理工大学软件学院7.4 泛型程序设计及泛型程序设计及STL简介简介7.3 类模板类模板7.2 函数模板函数模板7.1 理解模板理解模板大连理工大学软件学院大连理工大学软件学院7.1 理解模板第第7章章 模板模板C+中提供了对函数重载机制的支持: 定义重载函数时必须明确要处理什么类型的数据,如果对之后新出现的类型数据做相同的操作则要再次定义重载函数。函数模板函数模板就解决了函数重载中多次定义函数的问题。由于事物的相似性,C+程序设计的类类型和函数有时也是相似

2、的。类模板类模板就是对一批仅仅成员数据类型不同的类的抽象,模板模板可以实现类型参数化,从而实现了真正的代码可重用性。C+模板包括 函数模板和类模板两种类型。类型参数化类型参数化大连理工大学软件学院大连理工大学软件学院7.2 函数模板第第7章章 模板模板问题:求两参数之中小值函数:min ( a , b )对 a , b 的不同类型,都有相同的处理形式:return ( a b ? a : b) 问题 避开类型检查(2)重载问题 需要许多重载版本;不能处理新定义的类型(3)使用函数模板大连理工大学软件学院大连理工大学软件学院7.2 函数模板第第7章章 模板模板函数模板函数模板定义由模板参数说明模

3、板参数说明和函数定义组成,语法如下:template 函数返回值类型 函数名(形式参数表) 函数体 模板参数说明的每个类型参数必须在函数定义形参表中至少出现一次;函数形式参数表中可以使用模板类型参数,也可以使用一般类型参数. 大连理工大学软件学院大连理工大学软件学院7.2 函数模板第第7章章 模板模板函数模板函数模板定义由模板参数说明模板参数说明和函数定义组成,语法如下:template 函数返回值类型 函数名(形式参数表) 函数体 关键字class也可以使用关键字typename;函数模板允许使用多个类型参数,但在template定义部分的每个形参前必须有关键字typename或class,

4、在template语句与函数模板定义语句之间不允许有别的语句大连理工大学软件学院大连理工大学软件学院7.2 函数模板第第7章章 模板模板当函数模板被调用时编译器才产生代码。根据实参的类型,替换函数模板中的类型参数。这个过程叫做函数模板的实例化(instantiating)。函数模板实例化后称为模板函数。编译器如何处理函数模板编译器如何处理函数模板?大连理工大学软件学院大连理工大学软件学院7.2 函数模板第第7章章 模板模板函数重载时,每个函数体内可以执行不同的动作;函数模板只适用于函数的参数个数相同而类型不同、函数体相同的情况函数模板与函数重载的区别函数模板与函数重载的区别?大连理工大学软件学

5、院大连理工大学软件学院7.2 函数模板第第7章章 模板模板函数模板的特化函数模板的特化: 函数模板可能不适合某种特殊的类型数据的处理,这时就需要为函数模板实例化提供特化的定义。函数模板特化的定义语法如下:template 返回类型 函数模板名(参数列表) 函数体template T min(T a, T b)return (ab)? a: b; int main()int m_iv = 5, m_iu = 10;double m_dv = 5.5, m_du = 10.5;cout min(m_iv,m_iu) endl;cout min(m_dv,m_du) endl; cout min(h

6、ello,world) endl;return 0;template const char * min( const char * s1, const char * s2 ) return (strcmp(s1,s2)0 ? s1 :s2); 函数模板函数模板函数模板的特化函数模板的特化7.2 函数模板第第7章章 模板模板7.2 函数模板第第7章章 模板模板程程序序中中既既定定义义了了函函数数模模板板又又定定义义了了特特化化函函数数时时,调调用用的的匹匹配配规规则是:则是:如如果果参参数数类类型型以以及及返返回回类类型型完完全全匹匹配配,则则先先选选择择普普通通函函数数,再再选选择择模模板板显

7、式特化函数作为调用的函数实例。(显式特化函数作为调用的函数实例。(VC6.0VC6.0支持的不好)支持的不好)否否则则,如如果果模模板板函函数数能能够够推推导导出出一一个个参参数数类类型型以以及及返返回回类类型型完完全全匹匹配配的的函数实例,则选择函数模板。函数实例,则选择函数模板。否否则则,如如果果调调用用函函数数的的实实参参以以及及返返回回类类型型能能够够进进行行隐隐式式转转换换成成与与普普通通函函数数或或者者模模板板显显式式特特化化函函数数的的类类型型匹匹配配,则则选选择择普普通通函函数数或或者者模模板板显显式式特特化化函数。函数。如果以上三条都不能匹配,则函数匹配失败,发生编译错误。如

8、果以上三条都不能匹配,则函数匹配失败,发生编译错误。第第7章章 模板模板template void swap ( ElementType *a , ElementTypeElementType *b *b )/交换实参所指数据交换实参所指数据 ElementType temp ; . 模板声明模板声明类属参数和变量类属参数和变量多参数的函数模板多参数的函数模板void swap ( int *x , int * y );void swap ( double *x , double *y );void swap ( char *x , char *y );main函数调用函数调用 课堂代码课堂代

9、码模拟第第7章章 模板模板课堂练习编写一个对具有编写一个对具有n个元素的数组个元素的数组a 求最小值的程求最小值的程序,要求将求最小值的函数设计成函数模板序,要求将求最小值的函数设计成函数模板min。编写编写main函数对函数对int、double数组调用数组调用min模板模板 课堂代码第第7章章 模板模板课后练习template void SortBubble ( ElementType *a , int size ) int i, work ; ElementType temp ; . 冒泡排序法的函数模板冒泡排序法的函数模板 void SortBubble ( int *array ,

10、int size );void SortBubble (BoxBox *boxes , int size *boxes , int size );编写BoxBox(长宽高)类,重载“ ”(体积大小),使用函数模板对BoxBox数组调用函数模板1.1.完成模板2.2.完成BoxBox类3.main3.main函数,调用intint、BoxBox数组排序 类模板实际上是函数模板的推广。类模板实际上是函数模板的推广。 类模板用于实现类模板用于实现类类 所需数据的所需数据的类型参数化类型参数化类模板主要用于数据存储(容器)类。类模板主要用于数据存储(容器)类。表示和算法不受所包含的元素类型的影响。 7

11、.3 类模板第第7章章 模板模板class Array /安全整形数组安全整形数组 public : Array ( int s ) ; Array ( ) ; int& operator (int index) ; Array& operator = (Array& rArr) ; friend ostream& operator(ostream& out, Array& a); protected : int size ; int * element ; ; 7.3 类模板第第7章章 模板模板类模板类模板类型为类型为T的数组的数组类定义类定义int类型数组类型数组类定义类定义string类

12、型数组类型数组类定义类定义Box类型数组类型数组类定义类定义Employee*类型数组类型数组 7.3 类模板第第7章章 模板模板类模板由模板说明和类说明构成类模板由模板说明和类说明构成 template 类声明类声明例如例如 templateclass TClass / TClass的成员函数的成员函数 private : Type DateMember ; /;类属参数必须至少类属参数必须至少在类说明中出现一次在类说明中出现一次 7.3 类模板第第7章章 模板模板templateclass Array public : Array ( int s ) ; virtual Array ()

13、; virtual const T& Entry( int index ) const ; virtual void Enter( int index, const T & value ) ; / T& operator (int index) ; protected : int size ; T * element ; ;一个数组类模板一个数组类模板 数据成员是数据成员是T T 类型指针类型指针 7.3 类模板第第7章章 模板模板template class /类说明体类说明体 ;template :(形参表)(形参表) /成员函数定义体成员函数定义体 。template :(形参表)(形参

14、表) /成员函数定义体成员函数定义体 类模板的声明与定义 7.3 类模板第第7章章 模板模板 template Array:Array (int s) size = (s 1 ) ? s : 1 ; element = new T size ; template Array : Array() delete element ; template const T& Array : Entry ( int index ) const return element index ; template void Array : Enter(int index, const T& value) eleme

15、nt index = value ; 类模板的成员函数类模板的成员函数是函数模板是函数模板 7.3 类模板第第7章章 模板模板templateclass Array public : Array ( int s ) ; virtual Array () ; virtual const T& Entry( int index ) const ; virtual void Enter( int index, const T & value ) ; protected : int size ; T * element ; ;template Array:Array(int s) if ( s 1 )

16、 size = s ; else size = 1 ; element = new T size ; template Array : Array() delete element ; template const T& Array : Entry ( int index ) const return element index ; template void Array : Enter(int index, const T& value) element index = value ; #include #include Array.hvoid main() Array IntAry( 5

17、) ; for (int i = 0; i 5; i + ) IntAry.Enter ( i, i ) ; cout Integer Array : n ; for ( i = 0; i 5; i + ) cout IntAry.Entry(i) t ; coutendl ; Array DouAry( 5 ) ; for ( i = 0; i 5; i + ) DouAry.Enter ( i, (i+1)*0.35 ) ; cout Double Array : n ; for ( i = 0; i 5; i + ) cout DouAry.Entry(i) t ; coutendl;数

18、组类模板数组类模板 class Array public : virtual const int & Entry( int index ) const ; virtual void Enter( int index, const int & value ) ; protected : int size ; int * element ; ;class Array public : virtual const double & Entry( int index ) const ; virtual void Enter( int index, const double & value ) ; pr

19、otected : int size ; double * element ; ;使用类模板的方法使用类模板的方法 (1).在程序开始的头文件中说明在程序开始的头文件中说明类模板类模板 的定义。的定义。(2).在适当的地方创建一个在适当的地方创建一个模板类模板类 的实例,的实例, 即一个模板类定义,同时创建该即一个模板类定义,同时创建该 模板类对象模板类对象。(3). 使用对象调用成员函数。使用对象调用成员函数。 其实参类型与模板类规定的类型一致。其实参类型与模板类规定的类型一致。 ;template class . ; 7.3 类模板第第7章章 模板模板函函数数的的形形式式参参数数类类型型可

20、可以以是是类类模模板板或或类类模模板板的的引引用用, 对对应应的的实实际际参参数数是是该该类类模模板板实实例例化的模板类对象化的模板类对象. 当一个函数拥有类模板参数时,这个函数当一个函数拥有类模板参数时,这个函数必定是函数模板必定是函数模板 . 7.3 类模板第第7章章 模板模板template void Tfun( const Array & x , int index ) cout x.Entry( index ) endl ; 一个用一个用 Array 作参数的函数模板作参数的函数模板 调用函数模板调用函数模板 Array DouAry( 5 ) ;Tfun( DouAry, 3);

21、7.3 类模板第第7章章 模板模板template void Tfun( const Array & x , int index ) cout x.Entry( index ) endl ; 一个用一个用 Array 作参数的函数模板作参数的函数模板 调用函数模板调用函数模板 Array DouAry( 5 ) ;Tfun(DouAry,3); 建立对象建立对象class Array public : Array ( int s ) ; virtual Array () ; virtual const double & Entry( int index ) const ; virtual vo

22、id Enter( int index, const double & value ) ; private: int size ; double * element ; ; 生成模板类生成模板类调用构造函数,实例化模板类,建立对象调用构造函数,实例化模板类,建立对象 调用函数调用函数virtual const double & Entry( int index ) const ;实例化为实例化为模板函数模板函数调用模板函数调用模板函数 7.3 类模板第第7章章 模板模板第第7章章 模板模板v类模板特化:对特定数据类型特殊处理。大连理工大学软件学院大连理工大学软件学院一个类模板在类层次结构中 既

23、可以是基类也可以是派生类: 类模板可以从模板类派生 类模板可以从非模板类派生 模板类可以从类模板派生 非模板类可以从类模板派生 7.3 类模板第第7章章 模板模板第第7章章 模板模板大连理工大学软件学院大连理工大学软件学院课堂练习:课堂练习:编写并使用数组类模板编写并使用数组类模板Array: (1)类中包括对数组进行排序、查找和求元)类中包括对数组进行排序、查找和求元素和的方法。素和的方法。 (2)然后由此产生模板类)然后由此产生模板类Array和和Array(Box重载重载、)。、)。v泛型程序设计是指编写完全一般化并可重复使用泛型程序设计是指编写完全一般化并可重复使用的程序,其效率不依赖

24、于具体数据类型。的程序,其效率不依赖于具体数据类型。v泛型泛型(Genericity),是指具有在多种数据类型上皆,是指具有在多种数据类型上皆可操作的含意,与模板有些相似。可操作的含意,与模板有些相似。v标准模板库标准模板库STL是泛型程序设计的代表作品。是泛型程序设计的代表作品。vSTL是一种高效、泛型、可交互操作的软件组件。是一种高效、泛型、可交互操作的软件组件。STL包含很多计算机基本算法和数据结构,而且包含很多计算机基本算法和数据结构,而且将算法与数据结构完全分离。将算法与数据结构完全分离。 7.4 范型程序设计及STL简介(自学)第第7章章 模板模板vSTL包括:包括: 容器、迭代器

25、、算法容器、迭代器、算法容器容器算法算法算法算法对对象象 7.4 范型程序设计及STL简介第第7章章 模板模板容器是存储数据的一种方式容器是存储数据的一种方式容器分类:容器分类: 顺序容器顺序容器 关联容器和容器适配器关联容器和容器适配器顺序容器:顺序容器: vector(矢量矢量)、list(链表链表)、deque(双端队列双端队列)关联容器关联容器 set(集合集合)、multiset、map(映射映射)、ultimap 7.4 范型程序设计及STL简介第第7章章 模板模板标准库容器类标准库容器类说明说明顺序容器顺序容器voctor(矢量矢量)list(列表列表)deque(双端队列双端队

26、列)从后面快速插入与删除,直接访问任何元素从后面快速插入与删除,直接访问任何元素从任何地方快速插入与删除,双链表从任何地方快速插入与删除,双链表从前或后面快速插入与删除,直接访问任何元素从前或后面快速插入与删除,直接访问任何元素关联容器关联容器set(集合集合)multiset(多重集合多重集合)map(映射映射)multimap(多重映射多重映射)快速查找,不允许重复值快速查找,不允许重复值快速查找,允许重复值快速查找,允许重复值一对一映射,基于关键字快速查找,不许重复值一对一映射,基于关键字快速查找,不许重复值一对多映射,基于关键字快速查找,允许重复值一对多映射,基于关键字快速查找,允许重

27、复值容器适配器容器适配器stack(栈栈)queue(队列队列)priority_queue后进先出后进先出(LIFO)先进先出先进先出(FIFO)最高优先级元素总是第一个出列最高优先级元素总是第一个出列 7.4 范型程序设计及STL简介第第7章章 模板模板迭代器类似于指针,用来访问容器中的单个数迭代器类似于指针,用来访问容器中的单个数据项。据项。迭代器由类迭代器由类iterator来表明。来表明。不同的迭代器必须用于不同的容器。不同的迭代器必须用于不同的容器。迭代器分类:迭代器分类: 向前迭代器,双向迭代器,随机迭代器向前迭代器,双向迭代器,随机迭代器使用迭代器:使用迭代器:数据访问数据访问

28、 与与 数据插入数据插入 7.4 范型程序设计及STL简介第第7章章 模板模板标准库迭代子类型标准库迭代子类型说明说明输入输入InputIterator从容器中读取元素。输入迭代子只能一次一个元从容器中读取元素。输入迭代子只能一次一个元素地向前移动素地向前移动(即从容器开头到容器末尾即从容器开头到容器末尾)。要重读必须从头开始。要重读必须从头开始。输出输出OutputIterator向容器写入元素向容器写入元素 。输出迭代子只能一次一个元素地向前移动。输出迭代子只能一次一个元素地向前移动。输出迭代子要重写,必须从头开始输出迭代子要重写,必须从头开始正向正向ForwardIterator组合输入

29、迭代子和输出迭代子的功能,组合输入迭代子和输出迭代子的功能,并保留在容器中的位置并保留在容器中的位置(作为状态信息作为状态信息),所以重新读写不必从头开始。所以重新读写不必从头开始。双向双向BidirectionalIterator组合正向迭代子功能与逆向移动功能组合正向迭代子功能与逆向移动功能(即从容器序列末尾到容器序列开头即从容器序列末尾到容器序列开头)随机访问随机访问RandomAccseeIterator组合双向迭代子的功能,并能直接访问容器中的组合双向迭代子的功能,并能直接访问容器中的任意元素,即可向前或向后调任意个元素。任意元素,即可向前或向后调任意个元素。STL算法在数据集上进行

30、操作算法在数据集上进行操作, 泛型算法不依赖于具体的容器。泛型算法不依赖于具体的容器。 泛型算法分类为泛型算法分类为(1)不修改序列的操作不修改序列的操作 find( )、cout( )、equal( )、mismatch( )和和search( )等。等。(2)修改序列的操作修改序列的操作 swap( )、copy( )、transform( )、replace( )、remove( )、 reverse( )、rotate( )和和fill( )等。等。(3)排序、合并和相关的操作排序、合并和相关的操作 sort( )、binary_search( )、merge( )、min( )和和max( )等。等。 7.4 范型程序设计及STL简介第第7章章 模板模板

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号