C++模板函数--简单易学

一、概述

①、模板是泛型编程的基础,泛型编程即一种独立于任何特定类型的编码方式。
②、模板是创建泛型类或函数的蓝图、公式。
③、公式: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;
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44585751

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值