这篇文章的主要内容是C++中的函数模板、类模板、STL的介绍。
希望对C++爱好者有所帮助,内容充实且干货,点赞+收藏防止找不到!
再次感谢每个读者和正在学习编程的朋友莅临!
更多优质内容请点击移驾:
目录
1.模板
(1)函数模板
假设一个场景:当我们要写一个swap()函数时候,是不是要这样写
cpp
#include<iostream>
using namespace std;
void swap(int& a,int& b)
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 2;
int b = 3;
swap(a, b);
return 0;
}
那当我们同时又想交换两个char类型的变量,是不是得这样写
cpp
#include<iostream>
using namespace std;
void swap(int& a,int& b)
{
int tmp = a;
a = b;
b = tmp;
}
void swap(char& c, char& d)
{
char tmp = c;
c = d;
d = tmp;
}
int main()
{
int a = 2;
int b = 3;
swap(a, b);
char c = 's';
char d = 'b';
swap(c, d);
return 0;
}
这样写构成了函数的重载,使得对应类型与对应的函数相匹配,每次交换时找到合适类型的函数。
虽然函数重载一定程度上解决了不同类型形参调用相同功能函数的需求,但是当每次有新的参数类型需求,又需要程序猿自己写一份重载函数出来。
由于这两个swap()函数的功能完全相同,只是参数类型不同,再写一份属实tm烦。
这时,顺应需求的模板就闪亮登场啦。
函数模板定义: 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
函数模板格式:template<class T1,class T2...>
函数形参(T1 a,T2 b)
光看这个格式可能有点突兀,下面就用swap函数来感受一下函数模板的魅力:
cpp
#include<iostream>
using namespace std;
template <class T>//函数模板
void newswap(T& a,T& b)
{
T tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 2;
int b = 3;
newswap(a, b);
char c = 's';
char d = 'b';
newswap(c, d);
return 0;
}
运用函数模板,代码明显更加简短,且不同类型形参,newswap函数都能应对自如。
原理: 函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器。
模板实例化: 用模板去产生特定具体类型函数的过程称作模板的实例化。
隐式实例化:让编译器自己推演模板参数的T的类型。例如上图,在swap函数调用时编译器可以通过实参的类型实例化模板参数T,从而产生T类型的函数供我们调用。
但是编译器推演不出来就会报错:
显式实例化:在模板函数调用时程序猿手动控制T的类型。
cpp
#include<iostream>
using namespace std;
template <class T>
void newswap(T& a,T& b)
{
T tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 2;
int b = 3;
newswap<int>(a, b);
return 0;
}
此时就是模板的显式实例化,程序猿显式实例化后,编译器就不会去推演模板参数T的类型了。
(2)类模板
类模板的大致思路和函数模板相同。
也是一个类只是由于参数的类型不同就得写不同参数类型的类。便将模板特性运用在类上。使得一份类模板可以同时供应不同类型参数的类需求,非常好用。
2.认识STL
(1)什么是STL
对于C++爱好者来说,STL可以说是C++标准库里最常用的工具库。它不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。熟练使用STL以及学习STL底层是必不可少的。
(2)STL的六大组件
(3)如何学习STL
第一境界:熟练使用STL
第二境界:了解STL底层
第三境界:扩充STL
总结:能用,能理,能扩展。
下篇文章开始进入C++中STL的深入学习。
今天的内容就分享到这里啦,如果对大家有所帮助,记得点赞收藏不迷路。订阅下方C++专栏。持续爆肝C++实用知识。