C++类模板与STL编程.ppt
《C++类模板与STL编程.ppt》由会员分享,可在线阅读,更多相关《C++类模板与STL编程.ppt(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第1010章章 类模板与类模板与STL编程编程C+语语言言程程序序设设计计教教程程第第10章章类类模模板板第第1010章章 类模板类模板学习目标 1.理解类模板的概念;2.掌握类模板的定义、实例化过程,会运用类模板;3.掌握栈类模板、链表类模板的使用;4.理解STL编程的基本思想;5.掌握STL容器的使用;6.熟练使用STL算法;7.理解STL函数对象;C+语语言言程程序序设设计计教教程程第第10章章类类模模板板C+语语言言程程序序设设计计教教程程第第10章章类类模模板板10.1 类模板 模板是C+语言的重要特征,它能够显著提高编程效率。利用C+的函数模板和类模板,能够快速建立具有类型安全的
2、类库集合和函数集合,进行大规模软件开发,并提高软件的通用性和灵活性。C+的标准模板库标准模板库(standard template library,简称STL)编程完全依赖模板的实现。类模板类模板是能根据不同参数建立不同类型成员的类。类模板中的数据成员、成员函数的参数、成员函数的返回值可以取不同类型,在实例化成对象时,根据传入的参数类型,实例化成具体类型的对象。类模板也称模板类。类模板定义的语法为:其中:template为模板关键字。模板参数表中的类型为参数化(parameterized)类型,也称可变类型,类型名为class(或typename);模板参数表中的类型也可包含普通类型,普通类型
3、的参数用来为类的成员提供初值。类模板中的成员函数可以是函数模板,也可以是普通函数。C+语语言言程程序序设设计计教教程程第第10章章类类模模板板1.类模板的定义类模板的定义template class 类名类名 成员名;成员名;;例如,下面定义了一个模板类Student,为了增强类的适用性,将学号设计成参数化类型,它可以实例化成字符串、整型等;将成绩设计成参数化类型,它可以实例化成整型、浮点型、字符型(用来表示等级分)等;C+语语言言程程序序设设计计教教程程第第10章章类类模模板板1.类模板的定义类模板的定义template /TNO,TScore 为参数化类型class Student pri
4、vate:TNO StudentIDnum;/参数化类型数组,存储姓名 TScore scorenum;/参数化类型数组,存储分数 public:TNO TopStudent()/普通函数 return StudentID0;int BelowNum(TScore ascore)/函数模板 return 0;void sort()/普通函数 ;模板类的成员函数还可以在类外定义,其语法如下:其中:模板参数表与类模板的模板参数表相同。模板参数名表列出的是模板参数表中参数名,顺序与模板参数表中的顺序一致。C+语语言言程程序序设设计计教教程程第第10章章类类模模板板1.类模板的定义类模板的定义temp
5、late 类型类型 类名类名 函数名函数名(参数表参数表)函数体函数体;模板类的成员函数还可以在类外定义,其语法如下:C+语语言言程程序序设设计计教教程程第第10章章类类模模板板1.类模板的定义类模板的定义template 类型类型 类名类名 :函数名:函数名(参数表参数表)函数体;函数体;其中:模板参数表与类模板的模板参数表相同;模板参数名表列出的是模板参数表中参数名,顺序与模板参数表中的顺序一致;例如,模板类Student的成员函数在类外实现如下:模板类Student的成员函数在类外实现如下:template class Student private:TNO StudentIDnum;T
6、Score scorenum;public:TNO TopStudent();int BelowNum(TScore ascore);void sort();template int Student:BelowNum(TScore ascore)return 0;template void Student:sort()template TNO Student:TopStudent()return StudentID0;一个类模板是具体类的抽象,在使用类模板建立对象时,才根据给定的模板参数值实例化(专门化)成具体的类,然后由类建立对象。与函数模板不同,类模板实例化只能采用显式方式。类模板实例化、
7、建立对象的语法如下:C+语语言言程程序序设设计计教教程程第第10章章类类模模板板2.类模板的实例化类模板的实例化类模板名类模板名 对象对象1,对象对象2,对象对象n;其中:模板参数值表的值为类型名,类型名可以是基本数据类型名,也可以是构造数 据类型名,还可以是类类型名。模板参数值表的值还可以是常数表达式,以初始化模板参数表中普通参数。模板参数值表的值按一一对应的顺序实例化类模板的模板参数表。例如,下面对模板类Student实例化:class String public:char Str20;void main()Student S1;S1.sort();Student S2;S2.TopStu
8、dent();编译Student S1;时:String 取代 TNO float 取代 TScore 100 取代 numC+语语言言程程序序设设计计教教程程第第10章章类类模模板板2.类模板的实例化类模板的实例化template class Student private:TNO StudentIDnum;TScore scorenum;public:TNO TopStudent()int BelowNum(TScore ascore)void sort();class Student private:String StudentID100;float score100;public:St
9、ring TopStudent();int BelowNum(float ascore);void sort();将类Student实例化成:C+语语言言程程序序设设计计教教程程第第10章章类类模模板板2.默认模板参数默认模板参数template class Student private:TNO StudentIDnum;TScore scorenum;public:TNO TopStudent();int BelowNum(TScore ascore);void sort();类模板的实例化过程与函数调用的实参与形参结合的过程相似,函数的形参可以采用默认值,类模板的类型参数也可以采用默认值
10、,这样避免每次实例化时都显式给出实参。TScore,num分别给出默认值int,10。用以下方式实例化:Student S1;class Student private:char*StudentID10;int score10;public:char*TopStudent();int BelowNum(int ascore);void sort();10.2 类模板应用1.栈类模板栈类模板C+语语言言程程序序设设计计教教程程第第10章章类类模模板板 栈是一种先进后出FILO(First In Last Out)的一种结构,在程序设计中广泛使用栈,栈的基本操作有:压栈push、出栈pop。其他操
11、作有判空、判满、读栈顶元素等。下图演示栈的操作:【例例10-1】将栈设计成一个类模板,在栈中存放任意类型的数据。分析分析:栈空间可以使用静态数组,本例中使用动态数组。使用指针top指向栈顶元素,使用成员函数push()、pop()、IsEmpty()、IsFull()分别进行压栈、出栈、判空、判满。1.栈类模板栈类模板891011121314151617181920212223242526272829303132/*p10_1.cpp 栈类模板template class Stack private:int size;int top;T*space;public:Stack(int=10);S
12、tack()delete space;bool push(const T&);T pop();bool IsEmpty()const return top=size;bool IsFull()const return top=0;C+语语言言程程序序设设计计教教程程第第10章章类类模模板板33343536373839404142434445464748495051525354555657585960616263646566template Stack:Stack(int size)this-size=size;space=new Tsize;top=size;template bool Sta
13、ck:push(const T&element)if(!IsFull()space-top=element;return true;return false;template T Stack:pop()return spacetop+;int main()StackS1(4);S1.push(x);S1.push(y);S1.push(z);S1.push(u);S1.push(v);while(!S1.IsEmpty()coutS1.pop()endl;return 0;运行结果运行结果:uzyx 2.链表类模板链表类模板C+语语言言程程序序设设计计教教程程第第10章章类类模模板板 【例例1
14、0-2】将线性链表设计成一个类模板,从而可以在链表节点中存放任意类型的数据。分析:分析:链表的操作见5.5.1,为了节省内存空间,将头指针与当前节点指针设计成static,为同类型链表所共有;为了便于操作,同样将链表的第一个节点当成头节点,不存储数据。链表的构成如下图所示:2.链表类模板链表类模板C+语语言言程程序序设设计计教教程程第第10章章类类模模板板5678910111213141516171819202122232425/p10_2.cpp*单向链表的类模板*#include using namespace std;template class ListNode private:TYP
15、E data;ListNode*next;static ListNode *CurNode;static ListNode *head;public:ListNode()next=NULL;head=CurNode=this;ListNode(TYPE NewData)data=NewData;next=NULL;程序解释:程序解释:第16行为不带参数的构造函数,用于建立头节点。第62行建立对象时,调用了不带参数的构造函数,建立了一个仅含头节点的链表。第20行为带数据域参数的构造函数,供函数AppendNode()动态建立节点对象时调用。2.链表类模板链表类模板C+语语言言程程序序设设计计教教
16、程程第第10章章类类模模板板262728293031323334353637383940414243444546474849void AppendNode(TYPE NewNode);void DispList();void DelList();template ListNode*ListNode:CurNode;template ListNode*ListNode:head;template Void ListNode:AppendNode(TYPE NewData)CurNode-next=new ListNode(NewData);CurNode=CurNode-next;templat
17、e void ListNode:DispList()CurNode=head-next;while(CurNode!=NULL)coutdatanext;2.链表类模板链表类模板C+语语言言程程序序设设计计教教程程第第10章章类类模模板板50515253545556575859606162template void ListNode:DelList()ListNode*q;CurNode=head-next;while(CurNode!=NULL)q=CurNode-next;delete CurNode;CurNode=q;head-next=NULL;程序解释:程序解释:由于链表的非头节点
18、为动态对象,因此,要使用delete删除节点,以释放内存。2.链表类模板链表类模板C+语语言言程程序序设设计计教教程程第第10章章类类模模板板6364656667686970717273 int main()ListNode CList;CList.AppendNode(A);CList.AppendNode(B);CList.AppendNode(C);CList.DispList();CList.DelList();CList.DispList();return 0;运行结果运行结果:ABC 从上述程序例子可见,类模板类模板是一种安全的、高效的重用代码的方式,并可以结合类继承性和函数重载,
19、实现更大范围类的代码重用代码重用。因此,类模板的应用在C+中占有重要的地位。C+语语言言程程序序设设计计教教程程第第10章章类类模模板板10.3 STL编程 STL(Standard Template Library),即标准模板库,是一个高效的C+程序库。STL是ANSI/ISO C+标准函数库的一个子集,它提供了大量可扩展的类模板,包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法,类似于Microsoft Visual C+中的MFC(Microsoft Foundation Class Library)。从逻辑结构和存储结构来看,基本数据结构的数量是有限的。对于其中的数据结构,
20、用户可能需要反复的编写一些类似的的代码,只是为了适应不同数据的类型变化而在细节上有所出入。如果能够将这些经典的数据结构,采用类型参数类型参数的形式,设计为通用的类模板和函数模板通用的类模板和函数模板的形式,允许用户重重复利用已有的数据结构复利用已有的数据结构构造自己特定类型下的、符合实际需要的数据结构,无疑将简化程序开发,提高软件的开发效率,这就是STL编程的基本设计思想。C+语语言言程程序序设设计计教教程程第第10章章类类模模板板10.3 STL编程 从逻辑层次逻辑层次来看,STL中体现了泛型化程序设计泛型化程序设计(generic programming)的思想,它提倡使用现有的模板程序代
21、码开发应用程序,是一种代码的重用技术(reusability)。代码重用可以提高软件开发人员的劳动生产率和目标系统质量,是软件工程追求的重要目标。许多程序设计语言通过提供标准库来实现代码重用的机制。STL是一个通用组件库,它的目标是将常用的数据结构和算法标准化、通用化,这样用户可以直接套用而不用重复开发它们,从而提高程序设计的效率。从实现层次实现层次看,STL是一种类型参数化类型参数化(type parameterized)的程序设计方法,是一个基于模板的标准类库,称之为容器类容器类。每种容器都是一种已经建立完成的标准数据结构。在容器中,放入任何类型的数据,很容易建立一个存储该类型(或类)的数
22、据结构。STL主要由五个部分组成,分别是容器(container)、迭代器(iterator)、适配器(adaptor)、算法(algorithm)以及函数对象(function object)。C+语语言言程程序序设设计计教教程程第第10章章类类模模板板10.3.2 STL容器 在STL程序设计中,容器容器(container)就是通用的数据结构通用的数据结构。容器用来承载不同类型的数据对象,就如同现实生活中,人们使用容器用来装载各种物品一样,但C+中的容器还存在一定的“数据加工能力”,它如同一个对数据对象进行加工的模具,可以把不同类型的数据放到这个模具中进行加工处理,形成具有一定共同特性的
23、数据结构。例如将int型、char型或者float型放到队列容器中,就分别生成int队列、char型队列或者float型队列,它们都是队列,具有队列的基本特性,但是具体数据类型是不一样的。STL容器主要包括向量(向量(vector)、列表()、列表(list)、队列()、队列(deque)、集)、集合(合(set/multiset)和映射()和映射(map/multimap)等。STL用模板实现了这些最常用的数据结构,并以算法的形式提供了对这些容器类的基本操作。STL中的所有容器都是类模板类模板,是一个已经建立完成的抽象的数据结构,因此可以使用这些容器来存储任何类型的数据,甚至是自己定义的类,
24、而无需自己再定义数据结构。例如利用deque容器,就很容易建立一个队列。C+语语言言程程序序设设计计教教程程第第10章章类类模模板板10.3.2 STL容器 C+的STL中的容器是同构同构的,每个容器只允许存储相同类型的数据相同类型的数据,也就是说,不能在同一个队列中同时存储int和double类型的数据元素。不过,可以分别创建两个单独的队列,一个用于存储int,另一个用来存储double。STL提供了大多数标准数据结构的实现,比如前面曾经提到的向量、列表、队列、集合等都是容器,用户在进行STL编程时,不必再编写诸如链表或队列之类的数据结构。不同的容器有不同的插入、删除和存取行为和性能特征,用
25、户需要分析数据之间逻辑关系,为给定的任务选择最合适的容器。在STL中,容器大致可以分为两类:顺序容器顺序容器和关联容器关联容器。C+语语言言程程序序设设计计教教程程第第10章章类类模模板板10.3.3 顺序容器 顺序容器(sequence container)以逻辑线性排列方式存储一个元素序列,在这些容器类型中的对象在逻辑上被认为是在连续的存储空间中存储的。在顺序容器中的对象有相对于容器的逻辑位置,如在容器的起始、末尾等。顺序容器可以用于存储线性表类型的数据结构。表表10-110-1 顺序容器顺序容器容器类名特性何时使用头文件vector(向量)在内存中占有一块连续的空间,存储一个元素序列。可
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 模板 STL 编程
限制150内