C++新特性探究(9.1):functor仿函数探究

在这里插入图片描述

相关博文:C++新特性探究(九):functor仿函数
在这里插入图片描述

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43297891/article/details/113954621
今日推荐