函数对象适配器 bind2nd bind1st

本文详细介绍了STL中的bind1st和bind2nd函数适配器如何将二元函数转换为一元函数,以及如何使用mem_fun_ref、mem_fun进行成员函数适配,并通过实例展示了针对一般函数的函数适配器ptr_fun的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bind1st bind2nd为STL标准库中函数,表示将二元函数对象转化为一元函数对象。

//bind2nd(op, value) (param)相当于op(param, value)
cout << count_if(v.begin(), v.end(), bind2nd(modulus<int>(),2)) << endl; 

表示将二元函数对象modulus转化为一元函数对象,bind2nd 内部保存第二个参数2,并作为modulus的第二个参数。
//bind1st(op, value)(param)相当于op(value, param);
cout << count_if(v.begin(), v.end(), bind1st(less<int>(), 2)) << endl;

2作为lind1st 的第一个参数。


针对成员函数的函数适配器

代码示例

class Person
{
public:
Person(const string& name) : name_(name) {}
void Print() const { cout<<name_<<endl; }
void PrintWithPrefix(string prefix) const { cout<<prefix<<name_<<endl; }
private:
string name_;
};


void foo(const vector<Person>& v)
{
for_each(v.begin(), v.end(), mem_fun_ref(&Person::Print));
for_each(v.begin(), v.end(), bind2nd(mem_fun_ref(&Person::PrintWithPrefix), "person: "));
}


void foo2(const vector<Person*>& v)
{
for_each(v.begin(), v.end(), mem_fun(&Person::Print));
for_each(v.begin(), v.end(), bind2nd(mem_fun(&Person::PrintWithPrefix), "person: "));
}

int main(void)
{
vector<Person> v;
v.push_back(Person("tom"));
v.push_back(Person("jerry"));
foo(v);


vector<Person*> v2;
v2.push_back(new Person("tom"));
v2.push_back(new Person("jerry"));
foo2(v2);
return 0;
}


mem_fun_ref(op) 调用op,op是某对象的一个const成员函数
mem_fun(op)         调用op,op是某对象指针的一个const成员函数


针对一般函数的函数适配器

示例

it = find_if(v.begin(), v.end(), bind2nd(ptr_fun(strcmp), ""));

查找v中第一个不等于“”的对象。使用ptr_fun将一般函数转化为bind2nd可以接受的标准类型。

bool check(int elem)
{
return elem < 3;
}

it = find_if(v.begin(), v.end(), not1(ptr_fun(check)));

查找 v中第一个不小于3的对象。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值