1.定义了调用操作符的类,其对象称为函数对象,即它们是行为类似函数的对象
Example:
class abs
{
public:
int operator()(int i)
{
return i>=0?i:-i;
}
};
int main()
{
abs ob;
cout<<ob(-1)<<endl; //1
return 0;
};
2.标准库定义的函数对象
头文件#include<functional>
Tips:
*每个类表示一个给定操作符
*每个函数对象类都是一个类模板
Example:
int main()
{
plus<int> add;
cout<<add(1,1)<<endl;//2
return 0;
};
3.在范型算法中使用标准函数对象
*函数对象常用于覆盖算法使用的默认操作符
Example:
int main()
{
int arr[]={3,1,4,2,5};
vector<int> vec(arr,arr+5);
sort(vec.begin(),vec.end(),greater<int>());
for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)
{
cout<<*it<<"\t"; //5 4 3 2 1
}
return 0;
};
4.函数对象的函数适配器
作用:用于特化和扩展一元和二元函数对象
*绑定器:每个绑定其接受一个函数对象和一个值
bind1st:将定值绑定到二元函数对象的第一个实参
bind2nd:将定值绑定到二元函数对象的第二个实参
int main()
{
int arr[]={3,1,4,2,5};
int res;
res=count_if(arr,arr+5,bind2nd(greater<int>(),2));
cout<<res<<endl; //3
return 0;
};
*求反器:将函数对象的真值求反
not1:将一元函数对象的真值求反
not2:将二元函数对象的真值求反
Eample:
int main()
{
int arr[]={3,1,4,2,5};
int res;
res=count_if(arr,arr+5,not1(bind2nd(greater<int>(),2)));
cout<<res<<endl;//2
return 0;
};
Example:
class abs
{
public:
int operator()(int i)
{
return i>=0?i:-i;
}
};
int main()
{
abs ob;
cout<<ob(-1)<<endl; //1
return 0;
};
2.标准库定义的函数对象
头文件#include<functional>
Tips:
*每个类表示一个给定操作符
*每个函数对象类都是一个类模板
Example:
int main()
{
plus<int> add;
cout<<add(1,1)<<endl;//2
return 0;
};
3.在范型算法中使用标准函数对象
*函数对象常用于覆盖算法使用的默认操作符
Example:
int main()
{
int arr[]={3,1,4,2,5};
vector<int> vec(arr,arr+5);
sort(vec.begin(),vec.end(),greater<int>());
for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)
{
cout<<*it<<"\t"; //5 4 3 2 1
}
return 0;
};
4.函数对象的函数适配器
作用:用于特化和扩展一元和二元函数对象
*绑定器:每个绑定其接受一个函数对象和一个值
bind1st:将定值绑定到二元函数对象的第一个实参
bind2nd:将定值绑定到二元函数对象的第二个实参
int main()
{
int arr[]={3,1,4,2,5};
int res;
res=count_if(arr,arr+5,bind2nd(greater<int>(),2));
cout<<res<<endl; //3
return 0;
};
*求反器:将函数对象的真值求反
not1:将一元函数对象的真值求反
not2:将二元函数对象的真值求反
Eample:
int main()
{
int arr[]={3,1,4,2,5};
int res;
res=count_if(arr,arr+5,not1(bind2nd(greater<int>(),2)));
cout<<res<<endl;//2
return 0;
};