在C++中,模板是一种创建泛型类或函数的机制,这些类或函数可以处理多种数据类型。这允许程序员编写更加通用和可重用的代码。
一.函数模板
函数模板声明和定义:通过关键词template声明template<class或typename T>
template<class T>
T add(T a,T b)
{
return a+b;
}
当然也可以声明和定义分开来.
例题:2017final函数模板
数据的间距问题(函数模板) 类point有三个数据成员:x、y和z, 分别代表x坐标、y坐标和z坐标,并有若干构造函数和一个重载-(减号,计算两点距离)的成员函数。 要求设计一个函数模板,
template < class T> double dist(T a, T b)
对int,float,point或者其他类型的数据,返回间距。
输入格式:
每一行为一个操作,每行的第一个数字为元素类型,1为整型元素,2为浮点型元素,3为point类型,若为整型元素,接着输入两个整型数据,若为浮点型元素,接着输入两个浮点型数据,若为point型元素,输入两个point型数据(x1 y1 z1 x2 y2 z2),输入0时标志输入结束。
输出格式:
对每个输入,每行输出一个间距值。
输入样例:
1 2 5
3 2 4 7 5 9 7
2 2.2 9.9
0
输出样例:
3
5.83095
7.7
代码:
#include<iostream>
#include<cmath>//后面用到了pow(),sqrt()函数
using namespace std;
// 定义 Point 类表示三维坐标点
class Point{
private:
double x;
double y;
double z;
public:
// Point 类构造函数,用于初始化 x、y、z 三个数据成员
Point(double a,double b,double c):x(a),y(b),z(c){};
// 友元函数,实现两个 Point 对象之间的距离计算
friend double operator-(Point,Point);
};
// 函数模板,用于计算任意类型的数据之间的距离
template <class T>
double dist(T a, T b){
return abs(a-b);
}
// 重载 - 运算符,计算两个 Point 对象之间的距离
double operator-(Point P1,Point P2){
return sqrt(pow(P1.x-P2.x,2)+pow(P1.y-P2.y,2)+pow(P1.z-P2.z,2));
}
// 主函数入口
int main(){
int i, j;
float p, q;
double x1, y1, z1, x2, y2, z2;
int flag;
while(1){
cin >> flag;
if(flag == 0){
break;
}
if(flag == 1){
cin >> i >> j;
// 调用 dist 模板函数计算 i 和 j 之间的间距,并输出
cout << dist(i, j) << endl;
} else if(flag == 2){
cin >> p >> q;
// 调用 dist 模板函数计算 p 和 q 之间的间距,并输出
cout << dist(p, q) << endl;
} else{
cin >> x1 >> y1 >> z1 >> x2 >> y2 >> z2;
Point P1(x1, y1, z1), P2(x2, y2, z2);
// 调用 operator- 函数计算 P1 和 P2 之间的距离,并输出
cout << dist(P1, P2) << endl;
}
}
return 0;
}
二.类模板
当你在类定义中使用了模板参数(如T
),那么你就定义了一个类模板。
例题:有序数组(类模板)
实现一个类模板,它可以接受一组数据,能对数据排序,也能输出数组的内容。
每行输入的第一个数字为0,1,2或3:为0时表示输入结束; 为1时表示将输入整数,为2时表示将输入有一位小数的浮点数,为3时表示输入字符。
如果第一个数字非0,则接下来将输入一个正整数,表示即将输入的数据的数量。
从每行第三个输入开始,依次输入指定类型的数据。
类模板:
template <class T>
class MyArray
输入样例:
1 3 2 3 1
2 4 1.5 2.6 3.7 0.5
3 2 A a
0
输出样例:
1 2 3
0.5 1.5 2.6 3.7
A a
代码部分 :
#include <iostream>
using namespace std;
template <class T>
class MyArray {
private:
int size;
T* data;
public:
MyArray(int s) {
size = s;
data = new T[size];
for (int i = 0; i < size; i++) {
cin >> data[i];
}
}
~MyArray() {
delete[] data;
}
void sort() {
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - 1 - i; j++) {
if (data[j] > data[j + 1]) {
T temp = data[j];
data[j] = data[j + 1];
data[j + 1] = temp;
}
}
}
}
void display() {
for (int i = 0; i < size; i++) {
cout << data[i];
if (i < size - 1) {
cout << " ";
}
}
cout << endl;
}
};
int main( )
{
MyArray<int> *pI;
MyArray<float> *pF;
MyArray<char> *pC;
int ty, size;
cin>>ty;
while(ty>0){
cin>>size;
switch(ty){
case 1: pI = new MyArray<int>(size); pI->sort(); pI->check(); pI->display(); delete pI; break;
case 2: pF = new MyArray<float>(size); pF->sort(); pF->check(); pF->display(); delete pF; break;
case 3: pC = new MyArray<char>(size); pC->sort(); pC->check(); pC->display(); delete pC; break;
}
cin>>ty;
}
return 0;
}
创建对象时需要声明对象类型MyArray<int> intArray; // 创建一个存储 int 的 MyArray 对象