**
模板类的简单应用
**
一、函数模板
(1)模板类的最大应用便是可以类型参数化,编写代码可以忽略类型。
例如下面交换两数的例子,普通交换函数在数值类型不同时需要编写两个不同的函数:
整数型:
void test_swap(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
浮点数型:
void test_swap(double &a,double &b){
double temp = a;
a = b;
b = temp;
}
而模板可以忽略类型,模板定义:
template<class T>//T在这里指代类型
void test_swap(T &a,T &b){ //模板类交换函数
T temp = a;
a = b;
b = temp;
}
void print_swap(){ //模板:自动类推导
int a = 10;
int b = 20;
cout << a << b << endl;
test_swap(a, b);
cout << a << b << endl;
int c = 3.14;
int d = 6.28;
cout << c << d << endl;
test_swap(c, d);
cout << c << d << endl;
}
(2)模板类与普通函数同名被调用时:c++优先考虑普通函数,如果想调用模板函数,只需在调用时加<>:
test_swap<>(a,b);
而在调用函数时,当模板函数比普通函数能得到更好的匹配时,也会优先调用模板函数。
(3)模板类与普通函数的区别:模板类不可以进行自动类转换,但是普通函数可以,例如:
void test_add(int a, char c) {
int b = a + c;
cout << b << endl;
}
能看到答案是:很明显是将c转换为十进制ASCII码进行相加
另外,函数模板在编写成功后计算机内部其实不是直接调用模板的,需要根据你的输入先生成一个模板函数,再完成调用。
二、类模板
类模板与函数模板类似,这里举一个简单示例:
template<class T>
class person {
public:
person(T id, T name) { //有参构造函数
this->pid = id;
this->pname = name;
}
void show() {
cout << "id:" << pid << "name:" << pname << endl;
}
public:
T pid;
T pname;
};
void test() {
person<int> p(10,20); //先指定模板类型,在进行赋值
p.show();
}
结果:
这里在对冒泡排序进行编写,正常的冒泡排序应该是这样(方法不唯一):
void print_arr(int *arr,int len) {
for (int i = 0; i < len; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
void maopao() {
int arr[] = { 1,6,3,9,7,8,2 };
int len = sizeof(arr) / sizeof(arr[0]);
print_arr(arr, len);
for (int i = 0; i < len ; i++) {
for (int j = i + 1; j < len; j++) {
if (arr[i] > arr[j]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
print_arr(arr, len);
}
但是当遇见其他字符类型的时候,这个排序很难适应。例如:
char charr[] = { 'a','e','f','c','b' };
int len = sizeof(charr) / sizeof(charr[0]);
所以这时候就需要模板:
template<class T>
void print_maopao(T *arr,int len) { //打印模板
for (int i = 0; i < len; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
template<class T>
void maopao1(T *arr,int len) {
for (int i = 0; i < len; i++) {
for (int j = i + 1; j < len; j++) {
if (arr[i] > arr[j]) {
T temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
print_maopao(arr, len);
}
结果: