第14章 重载操作符与转换(7)

本文探讨了函数对象在C++中的应用,包括作为函数调用操作符、用于标准库算法以及与其他自定义和标准库函数对象的交互。重点介绍了如何通过函数对象实现灵活的算法实现,并利用标准库提供的函数适配器进行特化和扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

14.8 调用操作符和函数对象
struct absInt{
int operator() (int val){
return val<0?-val:val;
}
};
int i = 100;
absInt absObj;
cout<<absObj(i)<<endl;
函数调用操作符必须声明为成员函数。一个类可以定义为函数调用操作符的多个版本,由形参的数目或类型加以区别。
定义了调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象。
14.8.1 将函数对象用于标准库算法
函数对象经常用作通用算法的实参
1. 函数对象可以比函数更灵活
class GT_cls
{
public:
GT_cls(size_t val=0):bound(val){}
bool operator()(const string &s)
{
return s.size()>=bound;
}
private:
string::size_type bound;
};
2. 使用GT_cls函数对象
GT_cls gt(6);
cout<<gt(string("1231244"))<<endl;
14.8.2 标准库定义的函数对象
标准库还定义了一组函数适配器,使我们能够特化或者扩展标准库所定义的以及自定义的函数对象类。这些标准库函数对象类型是在functional头文件中定义的。
1.每个类表示一个给定操作符
有两个一元函数对象(unary function-object)类:一元减(negate<type>)和逻辑非(logical not<Type>)。其余的标准库函数对象都是表示二元操作符的二元函数对象(binary function-object)类。
2. 表示操作数类型的模板类型
plus<int> intadd;
cout<<intadd(1,2)<<endl;
3. 在算法中使用标准库函数对象
vector<int> vec;
sort(vec.begin(),vec.end(),greater<int>());
第三个实参用于传递比较元素的谓词函数。
14.8.3 函数对象的函数适配器
标准库提供ingke一组函数适配器(function adapter),用于特化和扩展一元和二元函数的对象。函数适配器分为如下两类:
(1)绑定器(binder),是一种函数适配器,它通过将一个操作数绑定到给定值而将二元函数对象转换为一元函数对象。
(2)求反器(negator),是一种函数适配器,它将谓词函数对象的真值求反。
标准库定义了两个绑定器适配器:bind1st和bind2nd。bind1st将给定值绑定到二元函数对象的第一个实参,bind2nd将给定值绑定到二元函数对象的第二个实参。
greater<int> gre;
cout<<gre(10,0)<<endl;                     //1
cout<<bind1st(greater<int>(),10)(0)<<endl; //1
cout<<gre(10,20)<<endl;                    //0
cout<<bind1st(greater<int>(),10)(20)<<endl;//0
标准库还定义了两个求反器:not1和not2。not1将一元函数对象的真值求反,not2将二元函数对象的真值求反。
cout<<not2(less<int>())(10,20)<<endl;    //0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值