C++ 函数模板(1)函数模板基本语法,函数模板注意事项,以及函数模板案列—数组排序

C++ 函数模板(1)

昨天把总算把函数模板章节给学完了,并且把函数模板一个很不错的案例给整理了一下,今天就开始按顺序把这一星期记的笔记给整理整理,记的有点多,今天就先整理函数模板基本语法,函数模板注意事项,以及函数模板案列—数组排序,这三个部分吧。

01、模板-模板的概念
只是一个框架,通用性强,但不能直接使用。
作用:建立一个通用函数,其函数返回值类型和形参类型,可以不具体制定,用一个虚拟类型来代表。
目的:提高复用性,将类型参数化。
02、函数模板的基本语法

template<typename T>

template—声明创建模板。
typename—表明其后面符号是一种数据类型,可用class代替。
T—通用数据类型,名称可以替换,通常用大写字母。
具体测试案例:

#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;

}

//因为有太多数据类型,一个一个写太过麻烦,所以引出函数模板的应用
template<typename T>//函数模版,后面紧跟一个T,就是先声明,后面如果出现T了先不要报错
void myswap(T &a,T &b)//同样先声明一个函数,但不确定数据类型,用T来代表
{
    
    
	T temp=a;
	a=b;
	b=temp;
}

//写一个利用模板的输出函数
void test03()
{
    
    

	int a=10;
	int b=11;
	//两种输出方式
	//1、自动判断法
	//myswap(a,b);
	//2、提示法
	myswap<int>(a,b);
	cout<<"a="<<a<<endl;
	cout<<"b="<<b<<endl;
	
}

//写一个赋值输出函数
void test01()
{
    
    
	int a=11;
	int b=30;
	swapInt(a,b);
	cout<<"交换后a的值"<<a<<endl;
	cout<<"交换后b的值"<<b<<endl;
}


//再写一个浮点型输出函数
void test02()
{
    
    
	double d=3.1415926535;
	double t=3.3333333333;
	swapDouble(d,t);
	cout<<"交换后d的值"<<d<<endl;
	cout<<"交换后t的值"<<t<<endl;
}

int main()
{
    
    
	//test01();
	//test02();
	test03();


system("pause");
return 0;

}

03、函数模板注意事项
①自动类型推导,必须推导出一致数据类型T才可以使用。
②模板必须确定出T数据类型,才可以使用。
具体函数测试实现:

#include<iostream>
using namespace std;
//先把上次写的交换的函数给写出来
template<typename T>//正常写函数但之前加上模板的固定格式,,并且注意T代表的是通用相当于可以代表任意的
void myswap(T&a,T&b)
{
    
    
T temp=a;
   a=b;
   b=temp;
}

//自动类型推导输出型,必须推导出一致的数据类型T才可使用
void test01()
{
    
    
	int a=10;
	int b=20;
	char c='c';
	myswap(a,b);
	//myswap(a,c);//错误,因为推导不出一致的数据类型T
	cout<<"a="<<a<<endl;
	cout<<"b="<<b<<endl;
}
//模板必须确定T数据类型,才可以使用
//验证
template<typename T>
void func()
{
    
    
cout<<"func 调用"<<endl;

}

//输出这个函数
void test02()
{
    
    
//func();没有用到T的数据类型,所以没办法调用该函数输出
	func<int>();//确定了T的数据类型(虽然T的类型可以随意定义,因为func函数是一个空的函数)
}

int main()
{
    
    
	test01();
	test02();
system("pause");
return 0;
}

04、函数模板案例----数组排序
实现通用对数组进行排序的函数:
规则 → 从小到大
算法 → 选择
测试 → char数组、int数组
具体代码实现:

#include<iostream>
#include<string>
using namespace std;

//目的:实现通用的对数组进行排序的函数
//规则:从小到大
//算法:选择
//测试:char 数组、int数组
//函数交换模板
template<typename T>
void myswap(T a,T b)
{
    
    
int temp =a;
a=b;
b=temp;
}

//选择排序函数模板
template<typename T>
void mysort(T arr,int len )
{
    
    
for(int i=0; i<len;i++)
{
    
    
//假设i项为最小项
	int min=i;
	for(int j=i+1;j<len;j++)
	{
    
    
	//将第i项与第j项进行比较
		//
		if(arr[min]>arr[j])
	 	{
    
    
		//交换两个数组的下标
		myswap(arr[i],arr[j]);
		}
	}
}

}
//输出函数模板
template<typename T>
void myprint(T arr[],int len )//len一定是int型,如果也写成T则会造成不一致现象无法输出
{
    
    
	for(int i=0;i<len;i++)
	{
    
    
	cout<<arr[i]<<" ";
	}
	cout<<endl;
}

//测试函数
void test01()
{
    
    
	char charArr[]="acbed";
    int len=sizeof(charArr)/sizeof(char);
	mysort(charArr,len);
	myprint(charArr,len);
}

int main()
{
    
    
	test01();

system("pause");
return 0;
}

end–出现的小问题
1、注意double位数
2、函数是提前声明的 int main是调用写代码的
3、cout输出 ,出现未定义标识符还是函数结构问题
4、测试char数组写法:char charArr[]=" "
5、数组长度计算:int num=sizeof(charArr)/sizeof(charr)

好的,就先整理这么多吧。

猜你喜欢

转载自blog.csdn.net/qq_45252077/article/details/107876431