前言:最近在准备CCF-CSP考试,学习一下STL模板库,阅读本文需对C++有基本了解(虽然本文介绍的也是基础内容);
学习视频:学习C++标准模版库(STL)
目录
0:模板-template
template关键字用于声明模板类;
0.1在函数中使用template:
在函数声明的上一行输入以下代码:
template <typename T>
例如:
template <typename T>
//求x的平方
T square(T x){
return x*x;
}
优点:省去书写大量的重载函数,程序可自主识别x类型并返回平方值;
值得注意的是:当输入的x为非数值类型时会出错,要记得进行健壮性检测;
0.2在类中使用template
在类的声明前一行输入template声明
我们来看一个例子:
template <typename T>
class BoVector{
T arr[100];
int size;
public:
BoVector():size(0){};//这种类的初始化方法需要熟练使用
void push(T x){arr[size]=x;++size;}
void Show(){
for(int i=0;i<size;i++){
cout<<arr[i]<<" ";
}
cout<<endl;
}
};
int main(){
BoVector<int> bv;//这里需要指出,需在<>内指出模板类T的类型
bv.push(4);
bv.push(9);
bv.push(16);
bv.Show();
return 0;
}
我只需要声明一个BoVector即可使用int、long、char等多种类型的向量,只需要在实例定义时,在<>内声明类型即可;
0.3 运算符重载
在运算符重载中也可使用template类及使用了template类的类(如BoVector);
我们不妨重载一下BoVector类的乘法:
添加get(int i)与getSize()两个函数如下:
T get(int i)const {return arr[i];}
int getSize()const {return size;}
编写乘法重载函数operator*如下:
template <typename T>
BoVector<T> operator*(const BoVector<T>& A,BoVector<T>& B){
BoVector <T> result;
for(int i=0;i<A.getSize();i++){
result.push(A.get(i)*B.get(i));
}
return result;
}
编程易错点:
在定义或声明使用了template类的实例时,需在类名后加<具体类型>;
[一个使用了模板类的类]<具体类型> [实例名]
我们将square与BoVector结合起来,即可得到如下代码:
#include<iostream>
using namespace std;
template <typename T>
//求x的平方
T square(T x){
return x*x;
}
template <typename T>
class BoVector{
T arr[100];
int size;
public:
BoVector():size(0){};
void push(T x){arr[size]=x;++size;}
T get(int i)const {return arr[i];}
int getSize()const {return size;}
void Show(){
for(int i=0;i<size;i++){
cout<<arr[i]<<" ";
}
cout<<endl;
}
};
template <typename T>
BoVector<T> operator*(const BoVector<T>& A,BoVector<T>& B){
BoVector <T> result;
for(int i=0;i<A.getSize();i++){
result.push(A.get(i)*B.get(i));
}
return result;
}
int main(){
BoVector<int> bv;//这里需要指出,需在<>内指出模板类T的类型
bv.push(4);
bv.push(9);
bv.push(16);
BoVector<int> res;
res=square(bv);
res.Show();
return 0;
}
自己运行试试看吧!