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:

  

(〃>_<;〃)(〃>_<;〃)(〃>_<;〃)

posted @ 2023-08-03 21:07  我会变强的  阅读(8)  评论(0编辑  收藏  举报