函数对象
1.什么是函数对象
1.类中重载了(),这个类实例化的对象叫函数对象(仿函数);
2.一元仿函数是operator()中只需要一个参数。二元仿函数是operator()中需要二个参数
2.有什么用
1.做为算法的策略
void test()
{
vector<int> v;
v.push_back(8);
v.push_back(1);
v.push_back(6);
v.push_back(3);
v.push_back(7);
//内建函数对象(仿函数)
sort(v.begin(), v.end(), greater<int>());
for_each(v.begin(), v.end(), [](int val){cout << val << " "; });
//[](int val){cout << val << " "; }//匿名函数
}
3.函数对象和普通函数的区别
1.函数对象可以有自己的状态
2.普通函数没有类型,函数对象有类型
3.函数对象比普通函数执行效率有可能更高(成员函数自动申请为内联函数)
4.谓词
1.谓词是指普通函数或重载的operator()返回值是bool类型的函数对象(仿函数)。
2.谓词可以作为一个判断式
3.接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元谓词
struct GreaterThanFive{
bool operator()(int v){
return v >5;
}
};
//一元谓词
void test01(){
vector<int> v;
for(int i =0; i <10;i++){
v.push_back(i);
}
vector<int>::iterator ret = find_if(v.begin(), v.end(), GreaterThanFive());
if(ret == v.end()){
cout <<"没有找到!"<< endl;
}
else{
cout <<"找到:"<<*ret << endl;
}
}
//二元谓词
struct MyCompare{
bool operator()(int v1,int v2){
return v1 > v2;
}
};
void test02(){
vector<int> v;
srand((unsignedint)time(NULL));
for(int i =0; i <10; i++){
v.push_back(rand()%100);
}
for(vector<int>::iterator it = v.begin(); it != v.end(); it ++){
cout <<*it <<" ";
}
cout << endl;
//排序算法
sort(v.begin(), v.end(), MyCompare());
for(vector<int>::iterator it = v.begin(); it != v.end(); it++){
cout <<*it <<" ";
}
cout << endl;
}
5.内建函数对象
1.使用内建的函数对象要加入头文件#include
/*
template<class T> bool equal_to<T>//等于
template<class T> bool not_equal_to<T>//不等于
template<class T> bool greater<T>//大于
template<class T> bool greater_equal<T>//大于等于
template<class T> bool less<T>//小于
template<class T> bool less_equal<T>//小于等于
*/
void test01(){
equal_to<int> MyEqual;
if(MyEqual(10,20)){
cout <<"相等!"<< endl;
}
else{
cout <<"不相等!"<< endl;
}
标签:end,函数,对象,bool,template,谓词
From: https://www.cnblogs.com/wbcde116/p/18026245