【C++】函数对象和谓词的概念

本文介绍了C++中的函数对象(function object)概念,这些对象通过重载`operator()`模拟函数行为。标准库广泛使用函数对象以提供定制的回调行为。一元和二元谓词函数对象用于条件判断,返回布尔值。举例说明了如何定义和使用一元、二元谓词函数,以及展示了一个类模板函数对象`ShowElement`的实现和在STL中的应用。函数对象相比普通回调函数的优势在于可以记录自身状态。
摘要由CSDN通过智能技术生成

函数对象

重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象。一个类对象,表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个类对象,如果没有上下文,完全可以把它看作一个函数对待。
这是通过重载类的operator()来实现的。
“在标准库中,函数对象被广泛地使用以获得弹性”,标准库中的很多算法都可以使用函数对象或者函数来作为自定的回调行为;

谓词

一元函数对象:函数参数1个;
二元函数对象:函数参数2个;
一元谓词 函数参数1个,函数返回值是bool类型,可以作为一个判断式谓词可以使一个仿函数,也可以是一个回调函数。

二元谓词 函数参数2个,函数返回值是bool类型

一元谓词函数举例如下

1,判断给出的string对象的长度是否小于6
bool GT6(const string &s)
{
return s.size() >= 6;
}
2,判断给出的int是否在3到8之间
bool Compare( int i )
{
return ( i >= 3 && i <= 8 );
}
二元谓词举例如下
1,比较两个string对象,返回一个bool值,指出第一个string是否比第二个短
bool isShorter(const string &s1, const string &s2)
{
return s1.size() < s2.size();
}

函数对象基本使用

//类模板函数对象
template <typename T>
class ShowElement
{
public:
	ShowElement()
	{
		m_count = 0;
	}

	//重载()变成函数对象
	void operator ()(const T& t)
	{
		cout << t << " ";
		m_count++;
		showCount();
	}

	void showCount()
	{
		cout << "调用次数:" << m_count << endl;
	}
private:
	int m_count;
};

使用

ShowElement<int> se;
se(9);

结合STL

vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);

ShowElement<int> se1;

se1 = for_each(v1.begin(), v1.end(), se1);//值传递返回函数对象

总结

使用起来就是回调函数的感觉,不过比起回调函数来说函数对象能够记录自身状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值