绑定适配器
函数对象适配器(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() { vectorv; 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_function int,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; }