c++的函数对象和适配器
函数对象
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<functional>
#include<vector>
#include<algorithm>
using namespace std;
bool func(int val1,int val2)
{
return val1 > val2;
}
void test()
{
vector<int>v;
v.push_back(2);
v.push_back(7);
v.push_back(4);
//sort(v.begin(), v.end(),func);//降序
sort(v.begin(), v.end(), greater<int>());
for_each(v.begin(), v.end(), [](int val) {cout << val << " "; });
//[](int val) {cout << val << " "; }[]是匿名函数
}
//函数对象与普通函数的区别
//1:函数对象能有自己的状态
//2:普通函数没有类型,但函数对象有
//3:函数对象比普通函数更有效率,(成员函数自动申请为内联函数)
void test01()
{
plus<int>myplus;
cout << myplus(3, 5) << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
适配器
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<functional>
#include<vector>
#include<algorithm>
using namespace std;
void print(int val)
{
cout << val << " ";
}
struct myfunc
{
bool operator()(int val)
{
cout << val << " "<<endl;
return true;
}
};
//struct myfunc2
//{
// bool operator()(int val)
// {
// cout << val + 10 << " ";
// return true;
// }
//};
//第一步:继承binary_function<参数一,参数二,返回类型>
struct myfunc2 :public binary_function<int, int, void>
{
void operator()(int val1, int val2)const
{
cout << val1 + val2 << " ";//第三步实现函数体
}
};
void test()
{
vector<int>v;
v.push_back(2);
v.push_back(34);
v.push_back(122);
//for_each(v.begin(), v.end(), print);
for_each(v.begin(), v.end(), myfunc());
//返回时每个都加十
for_each(v.begin(), v.end(), bind2nd(myfunc2(),10));//第四步:用bind2nd绑定函数对象
}
//bind1st把10绑定给第一个参数,bind2nd把10绑定给第二个参数
//函数对象适配器not1 not2取反
//1:not1和not2区别:not1针对一元函数对象,not2针对二元函数对象
//第一步:继承
struct mynotfunc:public unary_function<int,bool>
{
bool operator()(int val)const//第二步:变常函数
{
return val >= 20;
}
};
int myfind(int val)
{
return val > 20;
}
void test02()
{
vector<int>v;
v.push_back(2);
v.push_back(34);
v.push_back(122);
vector<int>::iterator it=find_if(v.begin(), v.end(),not1( mynotfunc()));//第三步:适配
//vector<int>::iterator it = find_if(v.begin(), v.end(), myfind);
if (it == v.end())
{
cout << " 查找失败" << endl;
}
else
{
cout << " 查找成功" << *it << endl;//结果:打印出2
}
}
//not2的使用
struct myprint
{
bool operator()(int val1)
{
cout << val1 << " ";
return true;
}
};
struct mysort
{
bool operator()(int val1, int val2)
{
return val1 > val2;
}
};
void test03()
{
vector<int>v;
v.push_back(2);
v.push_back(34);
v.push_back(122);
//sort(v.begin(), v.end(),mysort());
//debug下会报错
sort(v.begin(), v.end(), not2(less<int>()));
//for_each(v.begin(), v.end(), myprint());
for_each(v.begin(), v.end(), [](int val) {cout << val << " "; });
}
//普通函数进行适配
//第一步:把一个参数变两个参数
void myprint1(int val,int val2)
{
cout << val+val2 << " ";
}
void test04()
{
vector<int>v;
v.push_back(2);
v.push_back(34);
v.push_back(122);
//第二步:把普通函数变函数对象ptr_fun
for_each(v.begin(), v.end(), bind2nd(ptr_fun(myprint1),100));
}
//成员函数适配
class maker
{
public:
maker(string name, int age)
{
this->name = name;
this->age = age;
}
void myprint2()
{
cout << "name:" << name << " " << "age:" <<age << endl;
}
public:
string name;
int age;
};
//void myprint2(maker& m)
//{
// cout << "name:" << m.name << " " << "age:" << m.age << endl;
//}
void test05()
{
vector<maker>v;
v.push_back(maker("aaa", 10));
v.push_back((maker("huihui", 18)));
v.push_back(maker("hhh", 20));
//for_each(v.begin(), v.end(), myprint2);
//当容器存储的是对象,用mem_fun_ref来适配它的成员函数
for_each(v.begin(), v.end(),mem_fun_ref( & maker::myprint2));
vector<maker*>v2;
v2.push_back(new maker("aaa", 10));
v2.push_back((new maker("huihui", 18)));
v2.push_back(new maker("hhh", 20));
//当容器存储的是对象指针,用mem_fun来适配它的成员函数
for_each(v2.begin(), v2.end(), mem_fun(&maker::myprint2));
}
int main()
{
test05();
system("pause");
return 0;
}