一、概述
①、模板是泛型编程的基础,泛型编程即一种独立于任何特定类型的编码方式。
②、模板是创建泛型类或函数的蓝图、公式。
③、公式:template < typename T> 【其中 " T "是自定义,可以是A 、 f……,都可以】。
二、使用选择排序算法,给指定数组排序
2.1、给一个整型数组排序
这个数组是 int 型,且顺序是打乱的,要求按照从小到大排序
selectionsort.h 头文件
#ifndef SELECTIONSORT_H
#define SELECTIONSORT_H
#include <iostream>
#include <cassert>
#include <ctime>
using namespace std;
//自定义一个命名空间
namespace setTestHeader {
//产生n个从rangL到rangR的数据
int *fun(int n,int rangL,int rangR)
{
assert(rangL <= rangR);//为了让函数更加健壮,保证rangL小于rangR,于是需要调用assert函数
int *arr = new int[n];
srand(time(NULL));//以当前时间为时间种子
for(int i=0; i<n; i++)
{
arr[i] = rand()% (rangR - rangL +1) + rangL;
}
return arr;
}
}
#endif // SELECTIONSORT_H
用于排序的头文件函数
#ifndef SORTALGORITHM_H
#define SORTALGORITHM_H
#include <iostream>
using namespace std;
//namespace sortAlgorithm {
//使用选择排序算法,来给数组进行排序
void sort(int arr[],int n)
{
int minIndex;
for(int i=0; i<n ;i++)
{
minIndex = i;
//寻找[i,n]之间最小值
for(int j=i+1; j<n; j++)
{
if(arr[j] < arr[minIndex])
minIndex = j;
}
//将当前位置,与最小值位置进行交换
swap(arr[i],arr[minIndex]);
}
}
#endif // SORTALGORITHM_H
int main()
{
int n = 20;
//产生n个 2~n个随机数组
int *arr = setTestHeader::fun(n,2,n);
cout << "排序前" << endl;
for(int i=0; i<n; i++)
{
cout << arr[i] << " ";
}
cout << endl;
cout << "排序后" << endl;
sort(arr,n);
for(int i=0; i<n; i++)
{
cout << arr[i] << " ";
}
cout << endl;
delete[] arr;//使用new申请的空间,需要使用delete来释放,否则会造成内存泄漏
}
以上代码可以看出,如果再需要给一个double型数组排序的话,那么需要重新再创建一个 double型类型的排序函数,那如果还要给string 型、float型、 char型……排序的话,那么需要些好多无用代码,造成代码冗余度增长,且不利于阅读、也会造成资源浪费。此时,就需要 ” 模板 “来解决。
// 使用模板,选择排序算法来给各类型数组排序
#ifndef SORTALGORITHM_H
#define SORTALGORITHM_H
#include <iostream>
using namespace std;
//namespace sortAlgorithm {
//使用选择排序,来给数组进行排序
template <typename T>
void sort(T arr[],int n)
{
int minIndex;
for(int i=0; i<n ;i++)
{
minIndex = i;
//寻找[i,n]之间最小值
for(int j=i+1; j<n; j++)
{
if(arr[j] < arr[minIndex])
minIndex = j;
}
//将当前位置,与最小值位置进行交换
swap(arr[i],arr[minIndex]);
}
}
#endif // SORTALGORITHM_H
//实现给类型排序结果
int main()
{
cout << "排序前" << endl;
float a[] = {1.2, 4.8, 3.2, 9.8,2.9};
for(int i=0; i<5; i++)
{
cout << a[i] << " ";
}
cout << endl;
cout << "排序后" << endl;
sort(a,5);
for(int i=0; i<5; i++)
{
cout << a[i] << " ";
}
cout << endl;
cout << "排序前" << endl;
string b[] = {"B", "H", "A", "K","E"};
for(int i=0; i<5; i++)
{
cout << b[i] << " ";
}
cout << endl;
cout << "排序后" << endl;
sort(b,5);
for(int i=0; i<5; i++)
{
cout << b[i] << " ";
}
cout << endl;
delete[] arr;//使用new申请的空间,需要使用delete来释放,否则会造成内存泄漏
}
2.2、给自定义类型排序
这里用到运算符重载,重载的运算符是带有特殊特殊名称的函数,函数名称是由关键字operator加要重载的运算符号组成。
#ifndef CUSTOMTYPE_H
#define CUSTOMTYPE_H
#include <iostream>
#include <string>
using namespace std;
//**提示:**在这我使用的是结构体,也可以使用类
struct Student{
string name;
int sorce;
bool operator < (const Student & otherStudent)//声明小于号重载运算符,用于比较俩个结构体的大小
{
return sorce < otherStudent.sorce;//按照成绩大小进行排序
}
friend ostream & operator << (ostream &os,const Student &student){
os << "Student :" << student.name << " " << student.sorce<< endl;
return os;
}
};
#endif // CUSTOMTYPE_H
int main()
{
//使用模板,可以实现自定义类型排序
cout << "排序前" << endl;
Student d[] = {{"B",90}, {"H",89}, {"A",99}, { "K",100},{"E",96}};
for(int i=0; i<5; i++)
{
cout << d[i];
}
cout << endl;
cout << "排序后" << endl;
sort(d,5);
for(int i=0; i<5; i++)
{
cout << d[i];
}
cout << endl;
delete[] arr;//使用new申请的空间,需要使用delete来释放,否则会造成内存泄漏
return 0;
}