c++11之STL

模板

STL是泛型编程的思想,C++的模板就是泛型编程的基础,模板即类型参数化

模板与宏函数

学过c的都知道有个宏函数的概念,宏函数是发生在预编译阶段,可以实现通过修改少量代码来改变很多处结构的思想,这其实就是泛型的思想。

//关于宏函数的简单介绍
#include <stdio.h>

#define AGE_OLDER (65)  //这里将AGE_OLDER定义为65,AGE_OLDER是判断是否为老人的界限。
						//65外面的括号是为了防止在替换时产生错误,每个宏函数都应尽量加上括号
int main(int argc,char ** argv) //进程的思想是一生二,二生三,三生万物。一般来讲main函数是
								//程序的入口,但main函数也是不凭空来的,argc和argv和他的爹有关,
								//这里不细说
{
	int zhangsan=80;    //这里定义张三的年龄为80
	if(zhangsan > AGE_OLDER)      //年龄大于AGE_OLDER(65)视为老人
	{
		printf("这是个老人");
	}
	int lisi=50;
	if(lisi > AGE_OLDER)     
	{
		printf("这不是老人");
	}
}

从以上代码可以看出,通过修改AGE_OLDER,可以直接修改main函数中两个地方的值,起到了方便修改的作用。但是宏函数容易产生二义性。
模板就是采用了宏函数的思想,不过发生在编译器阶段。同时,模板可用于类的泛型化。

下面写分别用宏函数以及模板写string,int和double类型的替换

宏函数版本:

#include <iostream> //宏函数版本

using namespace std;

#define MAX(T) T MAX_##T(T x,T y) {return x> y? x:y;} //这里的##起连接的作用
		MAX(int) MAX(double) MAX(string)			//产生了两次替换,一次是类型,一次是参数	
#define max(T)  MAX_##T 							//使得MAX_int可以写成max(int)
int main()
{
	cout<<"max 4,5 = " << max(int)(4,5)<<endl;
	cout<<"max 4.5,5.5 = "<<max(double)(4.5,5.5)<<endl;
	cout<<"max china,nzhsoft = "<<max(string)("china","nzhsoft")<<endl;
	return 0;
}

结果如下:

max 4,5 = 5
max 4.5,5.5 = 5.5
max china,nzhsoft = nzhsoft

模板版本

#include <iostream>

using namespace std;

template <typename T>  //这里typename也可以写成class
T Max(T x, T y)
{
	return x >y? x:y;
}
int main()
{
	cout<<"max 4,5 = " << Max<int>(4,5)<<endl;    //由于c++自带max函数,所以需写成Max
	cout<<"max 4.5,5.5 = "<<Max<double>(4.5,5.5)<<endl;	//也可以用::max解决命名冲突的问题	
	cout<<"max china,nzhsoft = "<<Max<string>("china","nzhsoft")<<endl;
	return 0;
}

结果如下:

max 4,5 = 5
max 4.5,5.5 = 5.5
max china,nzhsoft = nzhsof

模板的一些注意事项

1.模板并不会生成处理任何类型的实体,而是对于实例化模板参数的类型都从模板产生一个不同的实体,这种具体类型代替模板参数的过程称为模板实例化。实例化后的函数构成了重载关系,这种重载关系由C++类处理。
2.当使用函数模板并引发实例化的过程中,编译器需要查看模板的定义(而普通函数只需要声明即可)。鉴于此,通常将模板的声明与实现写同一个文件中,以(.h)结尾。
3.有些函数不需要输入,c++的模板会帮你推断类型。不过这种不输入类型的方法不保险,所以,尽量不采用这种方法。
4.在类模板中,但凡是表示类型的场合,都应该采用类模板名<模板参数>,但是多数编译器允许简化为类模板名。 见代码

template <typename T>
class compare
{
public:
	compare(T x, T y):_x(x),_y(y)
			{}
	conpare(const compare<T> &another)    //这里使用const compare &another也是可以的
	{
		_x=another._x;
		_y=another._y;
	}
	int max()
	{
		return _x>_y ? _x:_y;
	}
private:
T	_x;
T	_y;
}

总结

差别一般函数模板
传入的参数变量如50,‘a’等数据的类型,如int char
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值