STL的仿函数 和函数指针传参

C_age.h

//在C语言时代,要将函数当做参数传递,唯有通过函数指针
//以下是用函数指针实现参数传递的示例
# include <cstdlib>
# include<iostream>
using namespace std;
int fcmp(const void *elem1, const void*elem2);
void Test()
{
	int ia[10] = { 32, 92, 67, 58, 10, 4, 25, 52, 59, 54 };

	for (int i = 0; i < 10; i++)
	{
		cout << ia[i] << " ";
	}
	cout << endl;
	//需要给库里面的函数写控制选项,可以防止代码冗余,比如库里面实现了升序算法但是可以据此写一种策略
	//实现降序算法
	qsort(ia, sizeof(ia) / sizeof(int), sizeof(int), fcmp);
	//记住qsort的参数形式,共有四个参数,数组指针,数组的大小,所排数类型本身的大小,排序的方法 
	for (int i = 0; i < 10; i++)
	{
		cout << ia[i] << " ";
	}
}

//实现排序方法的函数
int fcmp(const void *elem1, const void *elem2)
{
	const int *i1 = (const int *)elem1;
	const int *i2 = (const int *)elem2;

	if (*i1 < *i2)
	{
		return -1;
	}
	else if (*i1 == *i2)
	{
		return 0;
	}
	else if (*i1>*i2)
	{
		return 1;
	}
}
//但是函数指针也有他的缺点:最重要的是他无法持有自己的状态(局部状态,local states),也无法达到组件技术中的可适配性
//——也就是无法再将某些修饰条件加诸于其上而改变其状态

//在头文件STL_age中用仿函数的方法实现实现这种策略
# include<iostream>
using namespace std;
template<class T>
struct plus1
	//实际上我理解的仿函数就是用一个类或对象重载()的方式实现函数功能,因为他不是函数呀,加上()
	//形式上类似于一个函数,故此命名为仿函数。
{
	T operator()(const T&x, const T&y)const//这里重载了()因此plus成了一个仿函数
	{
		return x + y;
	}
};

template<class T>
struct minus1
{
	T operator()(const T&x, const T&y)const
	{
		return x - y;
	}
};
int Test1()
{
	plus1<int> plusobj;
	minus1<int> minusobj;

//这样使用仿函数就像使用一般函数一样
	cout << plusobj(7, 8) << endl;
	cout << minusobj(7, 8) << endl;

	//以下是直接产生仿函数的临时对象或者说是匿名对象(第一对小括号),并用第二对小括号调试
	cout << plus1<int>()(7, 8) << endl;
	cout << minus1<int>()(7, 8) << endl;
	return 0;
}
//后记,刚开始验证时直接像STL上定义,plus和minus由于库中存在编译时出现变量不明确的 错误。
//变量名不明确的错误一般都是由于定义和库中相同变量名引起的。
//# include"C_age.h"
# include"STL_age.h"

int main()
{
	Test1();
	return 0; 
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值