主要针对C++泛型编程和STL技术做详细讲解探讨C++更深层的使用
一、模板
1.1模板的概念
模板是建立通用的模具,大大提高变用性
1.2函数模板
C++另一种编程思想称为泛型编程主要利用的主要技术是模板
C++提供两种模板机制:函数模板和类模板
1.2.1模板函数语法
函数模板作用:建立一个通用函数其函数返回值类型和形参类型可以不是指定的,可以用一个虚拟的类型代表
语法:template<typename T>其中typename可以用class替换
解释:template——声明创建模板
typename——表明后面的符号是一种数据类型,可以用class代替
T——通用的数据类型名称可以替换通用的大写字母
1.2.2函数模板的注意事项
1、自动类型推到必须推导出一样的数据类型才可以使用
2、模板必须要确定出T的数据类型,才可以使用
1.2.3函数模板案例
案例描述:利用函数模板大小封装一个排序函数可以对不同数据类型进行排序,排序规则从大到小,排序方法为选择排序分别利用char数组和int数组进行测试
#include<iostream>
using namespace std;
//利用模板去实现数组的排列
//直接利用模板把交换函数模板化
template<class T>//定义变量交换函数模板
void mySwap(T& a,T& b)
{
T temp = a;
a = b;
b = temp;
}
//1、利用选择排序(可以模板化排序函数)
template<class T>
void mySort(T arr[] ,int len)
{
for (int i = 0; i < len; i++)
{
int max = i;
for (int j = i+1; j < len; j++)
{
if (arr[max] < arr[j])
{
//如果小于则将两个数的位置交换
max = j;
}
}
if (max != i)
{
swap(arr[max], arr[i]);
}
}
}
void test01()//int类型的数组进行排序
{
int arr[] = { 5,3,2,4,1 };
int len = sizeof(arr) / sizeof(int);//求数组的长度
mySort(arr, len);
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
void test02()//char类型的数组进行排序
{
char arr[] = "bdcage";
int len = sizeof(arr) / sizeof(char);
mySort(arr, len);
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
int main()
{
//test01();
test02();
system("pause");
return 0;
}
1.2.3普通函数与函数模板的区别
普通函数调用时可以发生自动类型转换(隐式类型转换)
函数模板调用时如果利用自动化累心推到不会法神隐式类型转化
如果利用显示指定类型的方式可以发生隐式类型强转换
#include<iostream>
using namespace std;
//普通函数与函数模板区别
//1、普通函数调用可以发生隐式类型转换
//2、函数模板 用自动类型推到,不可以发生隐式类型转换
//3、函数模板 用显示指定类型,可以发生隐式类型转换
int myAdd(int a, int b)
{
return a + b;
}
//1、普通函数的隐式类型转换
void test01()
{
int a = 10;
int b = 20;
char c = 'a';//这里的普通函数发生了隐式的类型转换
cout << myAdd(a, c) << endl;
}
//2、函数模板自动类型推导,不可以发生隐式类型转换
template<class T>
T autoAdd(T a, T b)//返回的类型中也要注意一致的推到类型
{
return a + b;
}
//3、函数模板指定类型进行类型转换
template<class T>
T Addd(T a, T b)
{
return a + b;
}
void test02()
{
int a = 10;
int b = 20;
char c = 'f';
cout<< autoAdd(a,b) << endl;
}
void test03()
{
int a = 10;
char b = 20;
cout << Addd<int>(a, b) << endl;
}
int main()
{
test01();
test02();
system("pause");
return 0;
}
总结:建议使用显示指定类型的方式调用函数模板,因为可以自己确定通用类型
1.2.5普通函数与函数模板的调用规则
1、如果函数模板和普通函数都可以实现优先调用普通函数
2、可以通过空模板参数列表来强制调用函数模板
3、函数模板也可以发生重载
4、如果函数模板可以残生更好的匹配,优先调用函数模板
总结:既然提供了函数欧版,最好不要提供普通函数模板否则容易出现二叉性
1.2.6模板的局限性
模板的通用性并不是万能的,解决方法就是提供特定的类型提供具体化的模板