绑定适配器


函数对象适配器(bind1st bind2nd)

绑定适配器的作用是将二元函数对象转变为一元函数对象,由于在部分算法中可能只需要一个参数的回调函数,例如for_each,但是有些情况中我们需要传入多个参数。

首先我们定义一个学生类的自定义数据类型,通过for_each进行打印

class Student
{
public:
    Student(int x,int a)
    {
        this->id = x;
        this->name = a;
    }
public:
    int id;
    int name;
};

struct Output
{
    void operator()(Student v)
    {
        cout << v.id << v.name << endl;
    }
};
int main()
{
    vector v;
    Student v1(1, 1);
    v.push_back(v1);
    Student v2(1, 2);
    v.push_back(v2);
    Student v3(1, 3);
    v.push_back(v3);
    Student v4(1, 4);
    v.push_back(v4);
    for_each(v.begin(),v.end(), Output());
    return 0;
}

假如我们此时要求,在打印的过程中将所有学生的id加上自己的id的两倍,此时我们需要在仿函数中再传入一个参数,再打印的过程中将id加上自己的两倍即可。因此我们需要利用绑定适配器,由于for_each算法智能识别具有一个参数的仿函数,我们将具有两个参数的仿函数绑定为只有一个参数。

#include
#include
#include
#include
using namespace std;

class Student
{
public:
    Student(int x,int a)
    {
        this->id = x;
        this->name = a;
    }
public:
    int id;
    int name;
};

struct Output:public binary_functionint,void>
{
    void operator()(Student v,int sub)const 
    {
        sub = v.id;
        cout << v.id + sub * 2 << " " << v.name << endl;
    }
};
int main()
{
    vector v;
    Student v1(1, 1);
    v.push_back(v1);
    Student v2(1, 2);
    v.push_back(v2);
    Student v3(1, 3);
    v.push_back(v3);
    Student v4(1, 4);
    v.push_back(v4);
    for_each(v.begin(),v.end(), bind2nd(Output(),1000));
    return 0;
}