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的对象。