Functor 对象模拟函数
把类对象,像函数名一样使用。
仿函数(functor),就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator( ),这个类就有了类似函数的行为,就是一个仿函数类了。
operator( )语法格式:
例1:
附上例代码:
//小问学编程
#include<iostream>
#include<vector>
using namespace std;
class Pow
{
public:
int operator()(int i)
{
return i*i;
}
double operator()(double d)
{
return d*d;
}
};
int main()
{
Pow pow;
int i=pow(4);
double d=pow(5.5);
cout<<i<<endl;
cout<<d<<endl;
return 0;
}
例2:pow->mypow
附上例代码:
//小问学编程
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
class Pow
{
public:
double operator()(double x,int y)
{
int ret=1;
for(int i=0;i<y;i++)
ret*=x;
return ret;
}
};
int main()
{
int a=2;
cout<<pow(a,5)<<endl;
Pow mypow;
cout<<mypow(a,5)<<endl;
cout<<mypow.operator()(a,5)<<endl;
return 0;
}
补充例:
附补充例代码:
//小问学编程
#include<iostream>
using namespace std;
class Myclass
{
public:
Myclass(int x):_x(x){
};
int operator()(const int n)const{
return n*_x;
}
private:
int _x;
};
int main()
{
Myclass Obj1(3);
cout<<Obj1(6)<<endl;
return 0;
}
例3:std::sort回调函数
第一种
第二种
第三种
例4:functor的优势在于,是对象形式,可以携带更多的信息,用于做出判断。比如,我们可以在对象初始化的时候,传入参数来决定状态,而不用去修改源代码。
该程序中携带信息,升序降序由我决定
附例3,4代码:
第一种
//小问学编程
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool Compare(int a,int b)
{
return a>b;
}
int main()
{
int arr[7]={
3,5,1,5,2,6,8};
vector<int> vi(arr,arr+6);
//Compare c;
sort(vi.begin(),vi.end(),Compare);
for(auto itr=vi.begin();itr!=vi.end();++itr)
{
cout<<*itr<<endl;
}
return 0;
}
第二种
//小问学编程
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
class Compare
{
public:
bool operator()(int a,int b)
{
return a>b;
}
};
int main()
{
int arr[7]={
3,5,1,5,2,6,8};
vector<int> vi(arr,arr+6);
Compare c;
sort(vi.begin(),vi.end(),c);//放一个对象
for(auto itr=vi.begin();itr!=vi.end();++itr)
{
cout<<*itr<<endl;
}
return 0;
}
第三种
//小问学编程
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
class Compare
{
public:
bool operator()(int a,int b)
{
return a>b;
}
};
int main()
{
int arr[7]={
3,5,1,5,2,6,8};
vector<int> vi(arr,arr+6);
sort(vi.begin(),vi.end(),Compare());//放一个临时对象
for(auto itr=vi.begin();itr!=vi.end();++itr)
{
cout<<*itr<<endl;
}
return 0;
}
第四种 携带信息,升序降序由我决定
//小问学编程
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
class Compare
{
public:
Compare(bool b):flag(b){
}
bool operator()(int a,int b)
{
if(flag==true)
return a>b;
else
return a<b;
}
private:
bool flag;
};
int main()
{
int arr[7]={
3,5,1,5,2,6,8};
vector<int> vi(arr,arr+6);
sort(vi.begin(),vi.end(),Compare(false));//升序降序由我决定
for(auto itr=vi.begin();itr!=vi.end();++itr)
{
cout<<*itr<<endl;
}
return 0;
}