适配器

一种用来修饰容器或者仿函数或迭代器接口的东西

函数适配器

使用步骤

  1. 继承binary_function<参数1,参数2,…,返回值>

  2. 加上const修饰operator

  3. bind1st/bind2nd 绑定数据

bind1st 和bind2nd区别

对于绑定的数据而言,bind2nd按照顺序绑定,bind1st逆序绑定

代码

/*************************************************************************
	> File Name: main.cpp
	> Author: 
	> Mail: 
	> Created Time: 2019年12月31日 星期二 17时28分07秒
 ************************************************************************/

# include<iostream>
# include <string>
# include <vector>
# include <algorithm>
# include <functional>
using namespace std;
class MyPrint:public binary_function<int,int,void>  //operator的参数1,参数2,返回类型
{
    public:
    void operator()(int v,int start) const 
    {
        cout<< "v="<<v<< "  start ="<<start<<"  start+v = "<<start+v<<endl;
    }
};
void test01()
{
    vector<int> v;
    for(int i=0;i<10;i++)
        v.push_back(i);
    for_each(v.begin(),v.end(),[](int n){cout<<n<<" ";});
    cout<<endl;
    int num;
    cout<<"请输入:";
    cin>>num;
    //第一步  绑定数据 bind2nd
    //继承 binary_function<参数1,参数2,返回类型>
    //添加const修饰 operator()
    for_each(v.begin(),v.end(),bind2nd(MyPrint(),num));
    cout<<"bind1st"<<endl;
    for_each(v.begin(),v.end(),bind1st(MyPrint(),num));
}

int main()
{
    test01();
    return 0;
}

函数适配器.jpg

取反适配器

not1 一元函数适配器 : 修饰参数个数为1的函数

not2 二元函数适配器 :修饰参数个数为2的函数

使用步骤

  1. 继承unary_function<参数1,bool>
  2. 加上const修饰operator
  3. not1 绑定数据

代码

/*************************************************************************
	> File Name: main.cpp
	> Author: 
	> Mail: 
	> Created Time: 2019年12月31日 星期二 17时28分07秒
 ************************************************************************/

# include<iostream>
# include <string>
# include <vector>
# include <algorithm>
# include <functional>
using namespace std;

//取反适配器

class greaterThenFIve: public unary_function<int,bool>  //继承unary_function
{
    public:
        bool operator()(int val)const 
    {
        return val>5;
    }

};
void test01()
{
    vector<int> v;
    for(int i=0;i<10;i++)
        v.push_back(i);
    
    vector<int>::iterator pos=find_if(v.begin(),v.end(),not1(greaterThenFIve()));
    if(pos!=v.end())
    {
        cout<<"找到了"<<*pos<<endl;
    }
}

int main()
{
   test01();
    return 0;
}

取反适配器.bmp

函数指针适配器

ptr_fun:将普通函数适配为仿函数

代码

/*************************************************************************
	> File Name: main.cpp
	> Author: 
	> Mail: 
	> Created Time: 2019年12月31日 星期二 17时28分07秒
 ************************************************************************/

# include<iostream>
# include <string>
# include <vector>
# include <algorithm>
# include <functional>
using namespace std;

//函数指针适配器

void MyPrintrint03(int v,int start)
{
    cout<<v+start <<"  ";
}
void test01()
{

    vector<int> v;
    for(int i=0;i<10;i++)
        v.push_back(i);
    //将函数指针适配为函数对象
    for_each(v.begin(),v.end(),bind2nd(ptr_fun(MyPrintrint03),100));

}


int main()
{
    test01();
    return 0;
}

函数指针适配器.bmp

成员函数适配器

如果容器中存放的是对象指针 使用的是mem_fun

如果容器中存放的是对象,则使用mem_fun_ref

代码

/*************************************************************************
	> File Name: main.cpp
	> Author: 
	> Mail: 
	> Created Time: 2019年12月31日 星期二 17时28分07秒
 ************************************************************************/

# include<iostream>
# include <string>
# include <vector>
# include <algorithm>
# include <functional>
using namespace std;

class Person
{
    public: 
     Person(string name,int age)
    {
        m_name=name;
        m_age=age;
    }
    void showPerson()
    {

    cout<<"姓名:"<<m_name<<"   年龄: "<<m_age<<endl;
    }
    void PlugAge(int val)
    {
       m_age+=val;
    }
    private:
       string  m_name;
       int m_age;
};

void test01()
{
    
    vector<Person> v;
    Person v1("aaaa",10);
    Person v2("sdsdsd",20);
    v.push_back(v1);
    v.push_back(v2);
    //成员函数适配器mem_fun_ref
    for_each(v.begin(),v.end(),mem_fun_ref(&Person::showPerson));
    

}
int main()
{
    test01();
    return 0;
}

成员函数适配器.bmp