【STL标准模板库】(一)引入

一、问题引入

人们需要编写多个形式和功能相似的函数时,会通过使用模板来减少重复编写,增强代码的复用性,那么在学习使用模板前,我们先通过一个问题来引入。

题目:
1.比较整数10和20的大小并输出较大值
2.比较浮点数15.2和7.8的大小并输出较大值
3.比较字符串“hello”和“world”的大小并输出较大值

下面实现一下一般思路

// 通过编写三个函数来分别完成三个题目
int solution_int(int a,int b)
{
	if(a>b) return a;
	else return b;
}
//a>b?a:b 是三目运算符,满足a>b条件则返回冒号前的值,反之返回后者
double solution_double(double a,double b)
{
	return a>b?a:b;
}
//字符串的大小比较是通过比较其对应的 ASCII值的大小得出的结果
string solution_string(string a,string b)
{
	return a>b?a:b;
}
int main()
{
	int a=10,b=20;
	cout<<solution_int(a,b)<<endl;
	double m=15.2,n=7.8;
	cout<<solution_doublet(m,n)<<endl;
	string x="hello",y="world";
	cout<<solution_string(x,y)<<endl;
	return 0;
}

最后输出结果分别为2015.2world
至此,我们思考一个问题,如果要比较更多种数据类型的大小时,程序员要编写很多次不同数据类型的比较大小函数,使代码非常冗杂,这时候我们尝试用更简短的代码来实现这个问题。

二、C语言中的一种指令—宏

宏是一种c语言中的预处理指令,它提供了一种机制,可以用来替换源代码中的字符串。因为宏只需定义一次,但可以多次使用,所以使用宏能增强程序的易读性和可靠性。

// 这是使用宏的代码,也可输出较大值为20
#define solution(a,b) (a>b?a:b)
int main()
{
	int a=10,b=20;
	cout<<solution(a,b)<<endl;
	return 0;
}

但此时我们再使用一类数据类型来比较hello 与world的大小,这个数据类型是char定义的数组,hello和world也是可以存入其中的。

#define solution(a,b) (a>b?a:b)
int main()
{
	char a[10]="hello",b[10]="world";
	cout<<solution(a,b)<<endl;
	return 0;
}

这时,我们发现输出的结果为hello,根据之前的比较我们发现这次输出了错误的值,那么这是为什么呢?
难道是我们的电脑开小差一不小心算错了吗(笑
其实不是的,这是因为在预编译阶段会对宏做纯文本变换为(a>b?a:b) 然而纯文本变换之后的a、b都是两个字符串对应的数组名(首地址),此时也就是两个指针在比较大小了,也就意味着这样的比较是错误的!

因此,宏虽然可以摆脱数据类型的约束和限制,同时也无法做到检查数据类型,导致可能会出现像上述问题一样的严重错误。

三、将宏与函数组合→模板

此时我们就可以通过模板来解决这个问题,下面为模板的代码实现:

// An highlighted block
template<typename T>
T solution(T a,T b)
{
	return a>b?a:b;
}
int main()
{
	cout<<solution<int>(10,20)<<endl;
	cout<<solution<double>(15.2,7.8)<<endl;
	cout<<solution<string>("hello","world")<<endl;
	return 0;
}

此时我们通过使用函数模板解决了一系列不同数据类型的两两数值比较。其中先用T代替了一系列的数据类型先写出一个函数模板,其次在主函数中使用该函数时用 < 数据类型 > 来告诉模板应该进行什么样的数据类型的运行。

以上均为个人学习所得与拓展理解,如若您发现了一些问题或不足之处欢迎私信或在评论区指正!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值