什么是模板?为什么我们需要模板?
先假设一个场景,我们要编写一个函数交换a,b两个数的值
void swap(int& a,int& b)
{
int cmp=a;
a=b;
b=a;
}
swap函数可以帮我们交换两个int型的值,那如果要交换的类型是float,double类型呢?
当然我们可以选择函数重载,使它支持多个数据类型。
void swap(float& a,float& b);
void swap(double& a,double& b);
......
可是这就意味着我们就要编写大量重复的代码。
有没有一种方法可以优化这个过程,少写代码有能实现重载?
模板(template)是一种语法,是为了优化重载而产生的。
模板分为函数模板和类模板
这里我们先讲函数模板
template <typename T> //模板参数T T可以被实例化int,double等类型
void swap(T& x1,T& x2)
{
T tmp=x1;
x1=x2;
x2=tmp;
}
int main()
{
int a=0; b=1;
double c=1.1,d=2.2;
swap(a,b);//1;
swap(c,d);//3.3
return 0;
}
这样无论是int,float,int*,double,都可以使用
模板的实现原理:
模板类比成类,类实例化后才能使用,模板实例化重载函数被调用,因此swap(a,b)和swap(c,d)调用的不是void swap(T& x1,T& x2);而是void swap(T& x1,T& x2)产生的void swap(int x1,int x2), void swap(double x1, double x2)这两个函数。
得出结论:两次调用不是调用同一个函数,而是模版产生的同一函数。
泛型编程
当我们用模板进行编程时,函数针对的就不是某一种类型,而是广泛的类型,因此用模板编程方式也叫泛型编程。
模板的语法
template<typename T>//可以替换为template<class T>
//temppalte 关键字
void Swap(T& x, T& y)
{
T tmp = x;
x = y;
y = tmp;
}
T可以是自定义类型吗?可以
和atuo有关吗? 虽然都有自动识别类型的意思但不是一样的
T是固定的吗? 不是,T可以替换成T1,T2
x,y可以是不同类型吗?可以的
x,y可以充当返回值吗?可以的
模板的显式实例化
当x,y是不同类型时,会报错
temeplate<class T>
T Add(contst T& x,const T& y)
{
return a+b;
}
int main()
{
int a=0;
double b=0;
cout<<Add(a,b)<<endl;
}
T是int还是double型
用显示实例化来指定返回类型
ccout<<<int>Add(a,b)<<endl;
T就是int 返回值就是int型。相当于指定了T的类型,这就是显式实例化。
显式实例化更常用于指定栈的空间
T* fun(T n)
{
return new a[n];
}
int*p =<int> fun(n);
相当于T 被替换为int。
类模板
template<class T>
class A
{
public:
A()
{
_array=new T[capacity];
}
private:
T* _arry;
}
A<int> a;
类模板只能显式实例化。
类模板的声明定义分离
template<class T>
class A
{
public:
A()
{
_array=new T[capacity];
}
void value();
private:
T* _arry;
int a=0;
}
template<class T>
void A<T>::value()
{
return a;
}
A<int> a;
类外每个函数都要重写一遍template<class T>
函数的类型是A<T>,对于普通类,类名和类型是一样的,对于这个模板类,类名是A,类型是A<T>
STL:STL是什么?
STL是包罗数据结构和算法的软件框架。
以前用c的时候,我们要写二叉树,我们只能手搓一个,但是有人替换我们写好了树,图等多种数据结构,放在了STL中,我们只有调用STL的数据结构就行了。
STL六大组件
以String为例,什么是String?
String 是一个类里面包含成员变量和成员函数,String是用一个类来表示字符串,成员变量和成员函数提供了多种操作字符串的形式。字符串由C的char*,char []变成了String对象表示方式。
学习string打开 cplusplus.com - The C++ Resources Network
搜索类string,查看字符串的构造函数
int main()
{
string s1();//空字符串
string s2(10,'x');//"xxxxxxxxxx"
string s3("abcdef");//"abcdef"
string s4(s2);//copy s4
}
+=运算符重载是为了使得字符串有拼接的属性文章来源:https://www.toymoban.com/news/detail-463268.html
s2 += s3;//"xxxxxxxxxxabcdef"
学习STL的关键是学习文档的用法,利用学习的类和重载符的知识来更好地理解STL。 文章来源地址https://www.toymoban.com/news/detail-463268.html
到了这里,关于波奇学C++:模板和STL的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!