绑定适配器
用途:将二元的适配对象转变为一元
用法
#include
#include
vectorv;
for(i = 1;i<10;i++)
{
v.push_back(i);
}
struct myprint
{
void operator()(int v,int val)
{
cout << “v:”<< v << “val:” << val << end;
}
}
for_each(v.begin;v.end;myprint());//此时这么写是错误的,因为for_each只能接受一元适配器,myprint中重载的“()”目前有两个参数。
正确写法:
重构上述struct结构体。
struct myprint: public binary_function(int,int,void)//这里写法非常关键,写三种类型 其中前两种类型为适配函数所需要的参数,第三种为函数返回类型。
{
void operator()(int v,int val) const //这个const是必要的!!!!
{
cout << “v:”<< v << “val:” << val << end;
}
}
int dgz = 100;
for_each(v.begin;v.end;bind2nd(myprint(),100//或者写成参数形式,比如dgz));
//这时候把后边的100或者dgz看成适配函数的第二个参数。
如果是
for_each(v.begin;v.end;bind1st(myprint(),100//或者写成参数形式,比如dgz));
//把后边的100或者dgz绑定为函数的第一个参数。
将普通函数转变成函数对象,从而适应for_each的第三个参数变量,目的是为了把函数当成参数用
void myprint(int val,int val2)//两个参数,而放到for_each函数中时必须是一个参数,所以:
{
cout <<“val:”<< val << “val2:” << val2 << endl;
}
for_each(v.begin(),v.end(),bind2nd(str_fun(myprint),1000));//由于myprint是一个2元函数,需要将其变为1元,将第二个参数设置为默认参数。
for_each调用类中的函数方法
class A()
{
public:
A()
{
return a;
}
void show()
{
cout << “age:” <<age<<“height:”<<height<<endl;
}
~A()
{}
};
for_each(v.begin,v.end,mem_fun_ref(&A::show));//这个引用号语法背过~
如果vector中放的是类(比如A),后边使用mem_fun_ref函数。如果vector中放的类指针(A*),后边使用mem_fun函数。