写在前面⭐如果本篇博文对你有帮助那就 点赞 关注 收藏 一下吧目录1.函数对象1.1函数对象概念1.2函数对象使用2.谓词2.1谓词概念2.2一元谓词2.3二元谓词3.内建函数对象3.1内建函数对象意义3.2算术仿函数3.3关系仿函数3.4逻辑仿函数1.函数对象1.1函数对象概念概念●重载函数调用操作符的类其对象常称为函数对象●函数对象使用重载时行为类似函数调用也叫仿函数本质函数对象仿函数是一个类不是一个函数1.2函数对象使用特点●函数对象在使用时可以像普通函数那样调用可以有参数可以有返回值●函数对象超出普通函数的概念函数对象可以有自己的状态●函数对象可以作为参数传递示例class MyAdd { public: int operator()(int v1,int v2) { return v1 v2; } }; //1.函数对象在使用时可以像普通函数那样调用可以有参数可以有返回值 void test01() { MyAdd myAdd; cout myAdd(10,20) endl; } //2.函数对象超出普通函数的概念函数对象可以有自己的状态 class MyPrint { public: MyPrint() { this -count 0; } void operator()(string test) { cout test endl; this -count; } int count 0; //内部自己的状态 }; void test02() { MyPrint myPrint; myPrint(hello world); myPrint(hello c); myPrint(hello c); cout myPrint调用次数为: myPrint.count endl; } //3.函数对象可以作为参数传递 void doPrint(MyPrint mp,string test) { mp(test); } void test03() { MyPrint myPrint; doPrint(myPrint,hello world); }总结●仿函数写法非常灵活可以作为参数进行传递。2.谓词2.1谓词概念概念●返回bool类型的仿函数称为谓词●如果operator(接受一个参数那么叫做一元谓词●如果operator(接受两个参数那么叫做二元谓词2.2一元谓词示例//返回bool类型的仿函数称为谓词 //一元谓词 class Greater5 { public: bool operator()(int v) { return v 5; } }; void test01() { vectorintv; for (int i 0; i 10; i) { v.push_back(i); } //查找容器中有没有大于5得数字 //Greater5() 匿名函数对象 vectorint::iterator it find_if(v.begin(),v.end(),Greater5()); if (it v.end()) { cout 未找到 endl; } else { cout 找到了5的数字 *it endl; } }总结参数只有一个的谓词称为一元谓词2.3二元谓词示例//二元谓词 class MyCompare { public: bool operator()(int v1,int v2) { return v1 v2; } }; 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()); for (vectorint::iterator it v.begin(); it ! v.end(); it) { cout *it ; } }总结参数只有两个的谓词称为二元谓词3.内建函数对象3.1内建函数对象意义概念●STL内建了一些函数对象分类:●算术仿函数●关系仿函数●逻辑仿函数用法●这些仿函数所产生的对象用法和一般函数完全相同●使用内建函数对象需要引入头文件#includefunctional3.2算术仿函数功能描述●实现四则运算●其中negate是一元运算其他都是二元运算示例//内建函数对象 算术仿函数 //negate 一元仿函数 取反仿函数 void test01() { negateint n; cout n(50) endl; //输出-50 } //plus 二元仿函数 加法 void test02() { plusint p; cout p(10,20) endl; //输出30 }总结使用内建函数对象时需要引入头文件includefunctional3.3关系仿函数功能描述●实现关系对比示例//内建函数对象 关系仿函数 //大于 greater class MyCompare { public: bool operator()(int v1,int v2) { return v1 v2; } }; void test01() { vectorintv; v.push_back(10); v.push_back(40); v.push_back(20); v.push_back(30); v.push_back(50); for (vectorint::iterator it v.begin(); it ! v.end(); it) { cout *it ; } 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; }总结关系仿函数中最常用的就是greater大于3.4逻辑仿函数功能描述●实现逻辑运算示例//内建函数对象 逻辑仿函数 //逻辑非 logic_not void test01() { vectorboolv; v.push_back(true); v.push_back(false); v.push_back(true); v.push_back(false); // 1 0 1 0 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()); // 0 1 0 1 for (vectorbool::iterator it v2.begin(); it ! v2.end(); it) { cout *it ; } cout endl; }总结逻辑仿函数实际应用较少了解即可写到后面⭐如果本篇博文对你有帮助那就 点赞 关注 收藏一下吧