STL -函数适配器
适配器
一种用来修饰容器或者仿函数或迭代器接口的东西
函数适配器
使用步骤
继承binary_function<参数1,参数2,…,返回值>
加上const修饰operator
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;
}
取反适配器
not1 一元函数适配器 : 修饰参数个数为1的函数
not2 二元函数适配器 :修饰参数个数为2的函数
使用步骤
- 继承unary_function<参数1,bool>
- 加上const修饰operator
- 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;
}
函数指针适配器
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;
}
成员函数适配器
如果容器中存放的是对象指针 使用的是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;
}
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment