一.STL作用
由于C++相比较于Java没有交换函数,所以每次需要使用时,都需要自己写一个,并且还会出现数据类型不同,就要编写不同的函数,非常麻烦。因此,出现STL。
模板技术、类型参数化,编写代码可以忽略类型。
//int型交换
void Myswap(int& a, int& b) {
int temp;
a = temp;
a = b;
b = temp;
}
//double型交换
void Myswap(double& a, double& b) {
double temp;
a = temp;
a = b;
b = temp;
}
二.template(模板)关键字
作用:为了让编译器区分是普通函数还是模板函数。
template<class T>
//或者
template<typename T>
告诉编译器下面要写模板函数。且只对下面第一个函数生效。
例子:上面函数可以改写为:
template<class T>
void Myswap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
使用:
Myswap<int>(a1, b1);
//或
Myswap(a1, b1);
三.函数模板和普通函数的区别
1. 函数模板不准许自动类型转化
2. 普通函数能够自动进行类型转化
template<class T>
int MyAdd1(T& a, T& b) {
return a + b;
}
int MyAdd2(int a,char b) {//重载
return a + b;
}
int main() {
int a = 10;
int b = 20;
char c1 = 'a';
char c2 = 'b';
cout << "MyAdd1()=" << MyAdd1(a, b) << endl;
cout << "MyAdd2()=" << MyAdd2(a, c1) << endl;
}
结果:
但是如果是使用模板类,参数为int和char就会报错。
原因:MyAdd2()会自动将char转为int型,而模板类不会。
四.函数模板和普通函数一起调用规则
1. 函数模板可以像普通函数那样被重载
2. C++编译器优先考虑普通函数
3. 如果函数模板可以产生一个更好的匹配,那么选择函数模板
4. 可以通过空模板实参列表的语法限定编译器只能通过匹配模板
对于2解释:
template<class T>
T MyAdd(T& a, T& b) {
return a + b;
}
int MyAdd(int a,int b) {//重载
return a + b;
}
int main() {
int a = 10;
int b = 20;
char c1 = 'a';
char c2 = 'b';
MyAdd(a, b);
}
结果:调用普通函数
对于4的解释:
template<class T>
T MyAdd(T& a, T& b) {
return a + b;
}
int MyAdd(int a,int b) {//重载
return a + b;
}
int main() {
int a = 10;
int b = 20;
char c1 = 'a';
char c2 = 'b';
MyAdd<>(a, b);//空模板实参列表
}
结果:调用模板函数
五.函数模板实现原理
MyAdd(int a, int b);//产生模板一
MyAdd(float c, float d);//产生模板二
MyAdd(int e, int f);//调用模板一
在生产一个int型模板后,后续再次使用,只需要调用之前生产的模板类。