C++ STL小白学习笔记(零)——模板类template

2 篇文章 0 订阅

前言:最近在准备CCF-CSP考试,学习一下STL模板库,阅读本文需对C++有基本了解(虽然本文介绍的也是基础内容);

学习视频:学习C++标准模版库(STL)

目录

 

0:模板-template

0.1在函数中使用template:

0.2在类中使用template

0.3 运算符重载


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;
}

自己运行试试看吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值