无网站营销,黔西县住房和城乡建设局网站,市场营销十大经典案例,WordPress文章搜索cpu飙升1#xff0c;函数对象
1.1 函数对象概念
概念#xff1a;
重载函数调用操作符的类#xff0c;其对象常称为函数对象函数对象使用重载的#xff08;#xff09;时#xff0c;行为类似函数调用#xff0c;也称为仿函数
本质#xff1a;
函数对象#xff08;仿函数函数对象
1.1 函数对象概念
概念
重载函数调用操作符的类其对象常称为函数对象函数对象使用重载的时行为类似函数调用也称为仿函数
本质
函数对象仿函数是一个类不是一个函数
1.2 函数对象使用
特点
函数对象在使用是可以像普通函数那样调用可以有返回值函数对象超出普通函数的概念函数对象可以有自己的状态函数对象可以作为参数传递
示例
#includeiostream
using namespace std;//函数对象仿函数
/*
函数对象在使用是可以像普通函数那样调用可以有返回值
函数对象超出普通函数的概念函数对象可以有自己的状态
函数对象可以作为参数传递
*///1,函数对象在使用是可以像普通函数那样调用可以有返回值
class MyAdd
{
public:int operator()(int v1, int v2){return v1 v2;}
};//2,函数对象超出普通函数的概念函数对象可以有自己的状态
class Myprint
{
public:Myprint(){this-count 0;}void operator()(string test){cout test endl;this-count;}int count;
};void test01()
{MyAdd myAdd;cout myAdd(10, 10) endl;
}void test02()
{Myprint myprint;myprint(hello world);myprint(hello world);myprint(hello world);myprint(hello world);cout myPrint调用次数为 myprint.count endl;
}void doPrint(Myprint mp,string test)
{mp(test);
}
void test03()
{Myprint myprint;doPrint(myprint, C);
}int main()
{cout test01: endl;test01();cout endl;cout test02: endl;test02();cout endl;cout test03: endl;test03();cout endl;system(pause);return 0;
} 总结
仿函数写法非常灵活可以作为参数进行传递
2谓词
2.1谓词概念
概念
返回bool类型的仿函数称为谓词返回 operator()接受一个参数那么叫做一元谓词返回 operator()接受两个参数那么叫做二元谓词
2.2 一元谓词
返回 operator()接受一个参数那么叫做一元谓词
#includeiostream
using namespace std;
#includevector//仿函数 返回值类型数bool数据类型 称为谓词
//一元谓词class GreaterFive
{
public:bool operator()(int val){return val 5;}
};void test01()
{vectorintv;for (int i 0; i 10; i){v.push_back(i);}//查找容器中 有没有大于五的数字//GreaterFive()匿名函数对象vectorint::iterator it find_if(v.begin(), v.end(), GreaterFive());if (it v.end()){cout 未找到 endl;}else{cout 找到了大于5的数字为 *it endl;}
}int main()
{test01();system(pause);return 0;
} 2.3 二元谓词
返回 operator()接受两个参数那么叫做二元谓词
示例
#includeiostream
using namespace std;
#includevector
#includealgorithm//仿函数 返回值类型数bool数据类型 称为谓词
//二元谓词class MyCompare
{
public:bool operator()(int val1,int val2){return val1 val2;}
};void test01()
{vectorintv;v.push_back(10);v.push_back(40);v.push_back(20);v.push_back(30);v.push_back(50);//默认排序规则为从小到大sort(v.begin(), v.end());for (vectorint::iterator it v.begin(); it ! v.end(); it){cout *it ;}cout endl;//使用函数对象改变算法策略变为排序规则为从大到小sort(v.begin(), v.end(), MyCompare());cout ------------------------------------- endl;for (vectorint::iterator it v.begin(); it ! v.end(); it){cout *it ;}cout endl;
}int main()
{test01();system(pause);return 0;
}总结参数只有两个的谓词称为二元谓词
3内建函数对象
3.1 内建函数对象的意义
概念
STL内建了一些函数对象
分类
算术仿函数关系仿函数逻辑仿函数
用法
这些仿函数所产生的对象用法和一般函数完全相同使用内建函数对象需要引入头文件 #includefunctional
3.1.1 算术仿函数
功能描述
实现四则运算其中negate是一元运算其他都是二元运算
仿函数原型
templateclass T T plusT //加法仿函数templateclass T T minusT //减法仿函数templateclass T T miltipliesT //乘法仿函数templateclass T T dividesT //除法仿函数templateclass T T modulusT //取模仿函数templateclass T T negateT //取反仿函数
示例:
#includeiostream
using namespace std;
#includevector
#includealgorithm
#includefunctional//内建函数对象 算术仿函数//negete 一元仿函数 取反仿函数
void test01()
{negateintn;cout 取反仿函数 endl;cout n(50) endl;
}//加法仿函数
void test02()
{plusintp;cout 加法仿函数 endl;cout p(10, 20) endl;
}//减法仿函数
void test03()
{minusintm;cout 减法仿函数 endl;cout m(20, 10) endl;
}//乘法仿函数
void test04()
{multipliesintmul;cout 乘法仿函数 endl;cout mul(10, 20) endl;
}//除法仿函数
void test05()
{dividesintdiv;cout 除法仿函数 endl;cout div(20, 10) endl;
}//取模仿函数
void test06()
{modulusintmod;cout 取模法仿函数 endl;cout mod(20, 10) endl;
}int main()
{test01();test02();test03();test04();test05();test06();system(pause);return 0;
}3.1.2 关系仿函数
功能描述
实现关系对比
仿函数原型
templateclass T bool equal_toT //等于仿函数templateclass T bool not_equal_toT //不等于仿函数templateclass T bool greaterT //大于仿函数templateclass T bool greater_equalT //大于等于仿函数templateclass T bool lessT //小于仿函数templateclass T bool less_equalT //小于等于仿函数
示例
#includeiostream
using namespace std;
#includealgorithm
#includevector
#includefunctional//内建函数对象 关系仿函数
//大于 greater
class MyCompare
{
public:bool operator()(int v1, int v2){return v1 v2;}
};void test01()
{vectorintv;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);v.push_back(50);for (vectorint::iterator it v.begin(); it ! v.end(); it){cout *it ;}cout endl;//降序cout ---------------降序-------------------- endl;//sort(v.begin(), v.end(), MyCompare());sort(v.begin(), v.end(), greaterint());for (vectorint::iterator it v.begin(); it ! v.end(); it){cout *it ;}cout endl;
}class MyCompare1
{
public:bool operator()(int v1, int v2){return v1 v2;}
};int main()
{test01();system(pause);return 0;
}3.1.3 逻辑仿函数
函数原型
templateclass T bool logical_andT //等于仿函数templateclass T bool logical_orT //不等于仿函数templateclass T bool logical_notT //大于仿函数
示例
#includeiostream
using namespace std;
#includealgorithm
#includevector
#includefunctional//逻辑非 logical_not
void test01()
{vectorbool v;v.push_back(true);v.push_back(false);v.push_back(true);v.push_back(false);for (vectorbool::iterator it v.begin(); it ! v.end(); it){cout *it ;}cout endl;//利用逻辑非 将容器v搬运到 容器v2中并且执行反操作vectorboolv2;v2.resize(v.size());transform(v.begin(), v.end(), v2.begin(), logical_notbool());for (vectorbool::iterator it v2.begin(); it ! v2.end(); it){cout *it ;}cout endl;
}int main()
{test01();system(pause);return 0;
} 逻辑仿函数实际应用较少了解即可