所谓模版,就是写定一个模版,通过实例化适用于各种数据类型
(函数模版:对int, double 等都可以统一处理 )
(类模版:如STL中的各种容器,统一对int, double等各种数据类型进行处理的类)
template 的模版主要分为函数模版和类模版。
(1):函数模版
#include<iostream>
#include<algorithm>
#include <vector>
#include <fstream>
#include <string>
using namespace std;
template <class T> //模版
T add(T a,T b)
{
return a+b;
}
int main()
{
int x=1;
int y=1;
double n=1.3;
double m=1.2;
cout<<add(x,y)<<endl; //int加法,实例化出int add(int a,int b)
cout<<add(n,m)<<endl; /double,实例化出double add(double a,double b)
//一个模版函数实现了相当于两个函数的功能,其实还可以更多
return 0;
}
写定一个模版,再此基础上实例化具体不同数据类型的函数
"T"相当于待定的数据类型
(2):类模版
下面是一个容器的模版:
#include<iostream>
using namespace std;
template<class T,int smax=100> //类模版可以传值
class Stack
{
T *p; //容器相当于一个数组,p为首地址
int s_size; //大小
int s_max; //容量
public:
Stack();
~Stack();
void push(T a);
T pop();
bool empty();
T operator [](T a);
};
template<class T,int smax> Stack<T,smax>::Stack() //注意函数名的格式
{
if(smax!=100)s_max=smax;
else s_max=100;
s_size=0;
p=new T[s_max];
}
template<class T,int smax> Stack<T,smax>::~Stack()
{
delete [] p;
}
template<class T,int smax> void Stack<T,smax>::push(T a)
{
s_size++;
p[s_size-1]=a;
}
template<class T,int smax> T Stack<T,smax>::pop()
{
T t=p[s_size-1]; //先进后出
size--;
return t;
}
template<class T,int smax> bool Stack<T,smax>::empty()
{
return s_size==0;
}
template<class T,int smax> T Stack<T,smax>::operator [](T a)
{
return p[a];
}
int main()
{
Stack<int,100>A;
A.push(1); //Stack容器(类)的成员函数
A.push(2);
cout<<A[0]<<endl; //需要重载运算符
cout<<A[1]<<endl;
return 0;
}
输出结果:
1
2
理解了模版函数,待定数据类型“T”,其实模板类和模版函数是一样的\color{red}{理解了模版函数,待定数据类型“T”,其实模板类和模版函数是一样的}理解了模版函数,待定数据类型“T”,其实模板类和模版函数是一样的
都是通过待定数据类型T来应对各种不同数据类型,从而实现所谓的的模版功能\color{red}{都是通过待定数据类型T来应对各种不同数据类型,从而实现所谓的的模版功能}都是通过待定数据类型T来应对各种不同数据类型,从而实现所谓的的模版功能