C++黑马程序员——P167-170. 模板 函数模板基本语法,注意事项,案例-数组排序
- P167. 模板——模板的概念
- P168. ...——函数模板基本语法
- P169. ...——函数模板注意事项
- P170. ...——函数模板案例-数组排序
- P167. 模板的概念
模板 就是建立通用的模具,大大提高复用性。
模板的特点:
- 模板不可以直接使用,它只是一个框架
- 模板的通用并不是万能的
- P168. 函数模板基本语法
C++提供两种模板机制:函数模板 和 类模板
——————————————————————————————————————————————————————————
#include <iostream>
using namespace std;
// 交换两个整型的函数
void swapInt(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
// 函数模板
template<typename T> //声明一个模板,告诉编译器后面代码中紧跟着的T不要报错,T是一个通用数据类型
void mySwap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
void test01() {
int a = 10;
int b = 20;
//两种方式使用模板
//1. 自动类型推导
mySwap(a, b);
cout << "a = " << a << "\tb = " << b << endl;
//2. 显示指定类型
mySwap<int>(a, b);
cout << "a = " << a << "\tb = " << b << endl;
}
int main() {
test01();
return 0;
}
res:
总结:
- 函数模板利用关键字 template
- 使用函数模板有两种方式:自动类型推导、显示指定类型
- 模板的目的是为了提高复用性,将类型参数化
- P169. 函数模板注意事项
注意事项:
- 自动类型推导,必须推导出一致的数据类型T,才可以使用
- 模板必须要确定出T的数据类型,才可以使用
template<class T> //typaname可以替换成class
void mySwap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
void test01() {
// 1. 自动类型推导,必须推导出一致的数据类型T,才可以使用
int a = 10;
char c = 'c';
// mySwap(a, c); //错误!推导不出一致的T类型
}
// 2. 模板必须要确定出T的数据类型,才可以使用
template<class T>
void func() {
cout << "func 调用" << endl;
}
void test02() {
// func(); //错误!编译器不知道T的类型
func<int>(); //正确,直接显示指出T的类型为int,其他类型也可以
}
总结:
使用模板时必须确定出通用数据类型T,并且能够推导出一致的类型
- P170. 函数模板案例-数组排序
#include <iostream>
using namespace std;
// 案例描述:
// 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序
// 排序规则从大到小,排序算法为选择排序
// 分别利用char数组和int数组进行测试
// 交换函数模板
template<class T>
void mySwap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
// 排序算法
template<class T>
void mySort(T arr[], int len) {
for (int i = 0; i < len; i++) { // 每次外层循环,都会从待排序数组中选择最大值,放到前面
int max = i; //认定最大值下标
for (int j = i + 1; j < len; j++) {
if (arr[max] < arr[j]) { // 认定的最大值比遍历出的数值小,说明j下标元素才是真正的最大值
max = j; // 更新最大值下标
}
}
if (max != i) {
// 交换max和i元素
mySwap(arr[max], arr[i]);
}
}
}
// 打印数组模板
template<class T>
void printArray(T arr[], int len) {
for (int i = 0; i < len; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
void test01() {
//测试char数组
char charArr[] = "badcfe";
int len = sizeof(charArr) / sizeof(char);
mySort(charArr, len);
printArray(charArr, len);
}
void test02() {
// 测试int数组
int intArr[] = { 7,5,1,3,9,2,4,6,8 };
int len = sizeof(intArr) / sizeof(int);
mySort(intArr, len);
printArray(intArr, len);
}
int main() {
test01();
test02();
return 0;
}
res:
(〃>_<;〃)(〃>_<;〃)(〃>_<;〃)