Version 3.0
模板第十章
2
回顾
虚函数
纯虚函数
抽象类
动态绑定
虚析构函数
3
目标
函数模板
类模板
标准模板库( STL)
4
模板的概念
C++中的模板提供了重用源代码的方法
两种类型的模板
– 类模板
– 函数模板
5
如果没有函数模板 …
通过函数重载实现不用类型的操作
int max(int a,int b)
{
return a > b? a,b;
}
float max(float a,float b)
{
return a > b? a,b;
}
……
6
函数模板 4-1
对各种数据类型,执行完全相同的操作
根据函数调用中提供的参数,编译器自动实例化不同的对象代码函数
7
函数模板 4-2
#include <iostream.h>
template <class T>
T max(T a,T b)
{
return a > b? a,b;
}
void main()
{
cout << "max(20,30) = " << max(20,30) << endl;
cout << "max('t','v') = " << max('t','v') << endl;
cout << "max(10.1,15.2) = " << max(10.1,15.2) << endl;
}
返回两个元素的最大值
8
函数模板 4-3
编译器自动生成
int max(int a,int b)
{
return a > b? a,b;
}
float max(float a,float b)
{
return a > b? a,b;
}
char max(char a,char b)
{
return a > b? a,b;
}
9
函数模板 4-4
演示函数模板的使用
10
类模板 4-1
提供了对类中的类型进行参数化的方法
从类模板产生类的过程称为模板的实例化定义模板类的对象
classname<type> objectname(arglist);
11
类模板 4-2
template <class T>
class Stack
{
public:
Stack(int = 10);
~Stack()
{
delete [] stackPtr;
}
int push(const T&);
int pop(T&);
int isEmpty() { return top == -1; }
int isFull() { return top == size - 1; }
private:
int size;//Stack中的元素数
int top;
T* stackPtr;
};
可以存放任何对象的栈
12
类模板 4-3
template<class C>
void square(C num,C *result){
*result = num * num;
}
template<class T>
class Array {
public:
int getlength() {return length;}
T & operator[](int i) {return array[i];}
Array(int l) {
length = l;
array = new T[length];
}
~Array() {delete [] array;}
private:
int length;
T *array;
};
函数模板类模板
13
类模板 4-4
演示类模板的使用
14
STL简介 2-1
标准模板库 (STL)是一个 C++编程库
它的组件是高度参数化的
使 C++程序员能够进行通用的程序设计
15
STL简介 2-2
包括
– 容器类
– 算法
– 迭代器
标准模板库 (STL)中
– 通用算法被实现为函数模板
– 容器被实现为类模板
16
容器类
容纳其他对象的类
包括
– vector,list,deque,set,mutilset,map,multimap、
hash set,hash multiset,hash map和 hash multimap
其中每个类都是一个模板,能够被实例化容纳任意对象类型
17
算法
用于操纵容器中所保存的数据
有的算法与容器类是分离的
18
迭代器
将算法与容器分离的一种机制
允许程序顺序地遍历一个容器中的元素
有些迭代器(如 istream和 ostream迭代器)
与容器无关
19
总结
函数模板
类模板
标准模板库( STL)
20
你学会 C++了吗?