C ++関数テンプレート(1)関数テンプレートの基本構文、関数テンプレートの注意事項、および関数テンプレートのケースリスト-配列の並べ替え

C ++関数テンプレート(1)

昨日、ようやく関数テンプレートの章を学び終えて、関数テンプレートのとても良い例を整理しました。今日は、今週取ったメモを順番に整理し始めました。覚えているので、今日は整理します。 。関数テンプレートの基本構文、関数テンプレートの注意事項、および関数テンプレートのケース配列の並べ替え、これら3つの部分。

01. template-templateの概念は
、汎用性の高いフレームワークにすぎませんが、直接使用することはできません。
役割:一般的な関数を確立するために、関数の戻り値の型と仮パラメーターの型を具体的に指定することはできません。仮想型で表されます。
目的:再利用性を改善し、タイプをパラメーター化します。
02、関数テンプレートの基本構文

template<typename T>

template-テンプレートを作成することを宣言します。
typename-その背後にある記号がデータ型であることを示します。データ型はクラスで置き換えることができます。
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;
}

発生するマイナーな問題
1.2桁の数に注意してください
2.関数は事前に宣言されてい
ますintmainはコードを記述するための呼び出しです3.Cout出力、未定義の識別子または関数構造の問題
4。 char配列の書き込みをテストします:char charArr [] = ""
5.配列の長さの計算:int num = sizeof(charArr)/ sizeof(charr)

さて、最初にたくさん整理しましょう。

おすすめ

転載: blog.csdn.net/qq_45252077/article/details/107876431