函数模板

简介: 函数模板

1.平时我们在写一个函数交换的时候,常用语法

我们可以发现其会非常繁琐,在不同的数据类型之间还是要重新定义,工作量较大

#include<iostream>
using namespace std;
void swapint(int& a, int& b){
 int temp = a;
 a = b;
 b = temp;
}
void swapdouble(double& a, double& b) {
 double temp = a;
 a = b;
 b = temp;
}


2.在这里时我们要学习一个新的模板函数

template<typename T>
void myswap(T& a, T& b) {
 T temp = a;
 a = b;
 b = temp;
}
int main() {
 int a = 10;
 int b = 20;
 myswap(a, b);
 myswap<int>(a, b);
 /// <summary>
 /// myswap<int> (&:a,&:b)表示显示出转换的类型
 /// </summary>
 /// <returns></returns>
 cout << "a=" << a << endl;
 cout << "b=" << b << endl;
 return 0;
}

3.函数模板的注意事项

  A.必须确定出是相同的数据类型,才可以在一个函数当中同时使用多个变量

  B.模板必须要确定出具体的数据类型,才可以进行使用

template<class T>   //在这里typaname可以替换为class


4.函数模板案例------数组排序
选择排序


public int[] choiceSort(int[] arr){
for(int i = 0;i < arr.length;i++){
int m = i;  
for(int j = i + 1;j < arr.length;j++){
//如果第j个元素比第m个元素小,将j赋值给m  
if(arr[j] < arr[m]){
m = j;  
}
}
//交换m和i两个元素的位置  
if(i != m){
int t = arr[i];  
arr[i] = arr[m];  
arr[m] = t;  
}
}
return arr;  
}

冒泡排序:


public int[] bubbleSort(int[] arr){
for(int i = 0;i < arr.length;i++){
//比较两个相邻的元素  
for(int j = 0;j < arr.length-i-1;j++){
if(arr[j] > arr[j+1]){
int t = arr[j];  
arr[j] = arr[j+1];  
arr[j+1] = t;  
}
}
}
return arr;  
}



#include<iostream>
using namespace std;
template<class T>
void mySort(T arr[], int len) {
  for (int i = 0; i < len; i++)
  {
    for (int j = 0; j < len - i - 1; j++)
    {
      if (arr[i]> arr[j]) {
        T temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
      }
    }
  }
}
template<class T>
void Print(T arr[], int len)
{
  for (int i = 0; i < len; i++) {
    cout << arr[i] << "    " << endl;
  }
}
int main() {
  int arr[] = {1,32,12,5,98,5,656};
  int len = sizeof(arr) / sizeof(char);
  mySort(arr, len);
  Print(arr, len);
  return 0;
}

5.隐式转换

int add(int a, int b) {
 return a + b;
}
template<class T>
T addt(T a, T b) {
 return a + b;
}
int main() {
 int a = 10;
 char b = 'a';
 cout << add(a, b) << endl;
 cout << addt(a, b) << endl;
 cout << addt<int>(a, b) << endl;
 return 0;
}

在这里的时候如果参数的类型不相同,普通函数不会报错,但是模板函数会报错,但是在加入了限制数据类型<int>之后就不会报错了

6.类模板语法

#include<iostream>
#include<string>
using namespace std;
template<class Nametype,class Agetype>
class Person {
public:
 Person(Nametype name, Agetype age) {
  this->mname = name;
  this->mage = age;
 }
 void showperson() {
  cout << "mname:" << this->mname << "mname:" << this->mage << endl;
 }
public:
 Nametype mname;
 Agetype mage;
};
void showPerson() {
 Person<string, int> P("laozhichi", 19);
 P.showperson();
}
int main() {
 showPerson();
 return 0;
}

image.png

相关文章
|
缓存 算法 安全
内存管理
【10月更文挑战第7天】
369 86
|
开发框架 前端开发 应用服务中间件
部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用
部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用
|
存储 算法 大数据
树形结构——二叉树专题总结——满二叉树,完全二叉树(堆),普通二叉树以及相应的数据管理方式(下)
树形结构——二叉树专题总结——满二叉树,完全二叉树(堆),普通二叉树以及相应的数据管理方式(下)
187 0
|
程序员
这是个测试
这是个土味情话的标签,我用程序写的诗,写给我朋友的诗,写给未来的诗。
1107 0
|
5天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
14天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
9天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
580 212