为什么做营销型网站,有哪些网站做任务有佣金,加盟创业商机网,徐州市中宇建设工程有限公司网站1. 函数对象
1.1 函数对象概念
概念#xff1a;
重载函数调用操作符的类#xff0c;其对象常称为函数对象函数对象使用重载的 () 时#xff0c;行为类似函数调用#xff0c;也叫仿函数
本质#xff1a; 函数对象#xff08;仿函数#xff09;是一个类#xff0c;不…1. 函数对象
1.1 函数对象概念
概念
重载函数调用操作符的类其对象常称为函数对象函数对象使用重载的 () 时行为类似函数调用也叫仿函数
本质 函数对象仿函数是一个类不是一个函数
1.2 函数对象使用
特点
函数对象在使用的时候可以像普通函数那样调用可以有参数可以有返回值函数对象超出普通函数的概念函数对象可以有自己的状态 因为函数对象本质是一个类所以类的内部可以拥有一些成员属性来记录它的一些状态。 函数对象可以作为参数传递。
#include iostream
#include string
using namespace std;class MyAdd {
public:MyAdd() {this-count 0;}int operator()(int v1, int v2) {count;return v1 v2;}public:int count;//内部自己的状态
};int doAdd(MyAdd add, int v1, int v2) {return add(v1, v2);
}int main() {MyAdd myAdd;int ret myAdd(10, 20);//1.cout ret endl;cout myAdd.count endl;//2.普通函数需要借助外力使用全局变量或者静态变量记录使用的次数doAdd(myAdd, 20, 30);//3.return 0;
}总结
仿函数写法非常灵活可以作为参数进行传递
2. 谓词
2.1 谓词概念
概念
返回bool 类型的仿函数称为谓词如果 operator() 接受一个参数那么叫做一元谓词如果 operator() 接收两个参数那么叫做二元谓词
2.2 一元谓词
示例
#include iostream
#include vector
#include algorithm
using namespace std;class GreatFive
{
public:bool operator()(int val) {return val 5;}
};int main() {vectorint v;for (int i 0; i 10; i) {v.push_back(i);}//查找容器中有没有大于 5 的数字vectorint::iterator it find_if(v.begin(), v.end(), GreatFive());//GreatFive():创建一个匿名的函数对象if (it v.end()) {cout 未找到 endl;}else {cout 找到了大于 5 的数字 *it endl;}return 0;
}find_if(first, last, Pred); 三个参数firstlast区间谓词Pred按条件的方式来找一找有没有想要的结果它会遍历区间取出来每个数据仿函数判断是否满足条件返回 真 或 假若存在函数返回该元素的迭代器若不存在返回 end();GreatFive():创建一个匿名的函数对象 总结参数只有一个的谓词称为一元谓词。
2.3 二元谓词
示例
#include iostream
#include vector
#include algorithm
using namespace std;class MyCompare
{
public:bool operator()(int v1, int v2) {return v1 v2;}
};int main() {vectorint v;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;cout --------------------------------------------- endl;//使用函数对象改变算法策略变为排序规则从大到小sort(v.begin(), v.end(), MyCompare());for (vectorint::iterator it v.begin(); it ! v.end(); it) {cout *it ;}cout endl;return 0;
}总结参数只有两个的谓词称为二元谓词。
3. 内建函数对象
3.1 内建函数对象意义
概念
STL 内建了一些函数对象
分类
算数仿函数关系仿函数逻辑仿函数
用法
这些仿函数所产生的对象用法和一般函数完全相同使用内建函数对象需要引入头文件 #include functional
3.2 算数仿函数
功能描述
实现四则运算其中 negate 是一元运算其他都是二元运算
仿函数原型
templateclass T T plusT //加法仿函数templateclass T T minusT //减法仿函数templateclass T T multipliesT //乘法仿函数templateclass T T dividesT //除法仿函数templateclass T T modulusT //取模仿函数templateclass T T negateT //取反仿函数
#include iostream
#include functional//内建函数对象的头文件
using namespace std;int main() {negateint n;cout n(50) endl;//1.plusint p;//默认认为传入相同的数据类型不允许数据类型不同的两个数相加cout p(2, 10) endl;return 0;
}总结使用内建函数对象时需要引入头文件 #include functional
3.3 关系仿函数
功能描述
实现关系对比
仿函数原型
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 //小于等于
#include iostream
#include vector
#include functional//内建函数对象的头文件
using namespace std;int main() {vectorint v;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;cout --------------------------------------------- endl;//使用内建函数对象改变算法策略变为排序规则从大到小sort(v.begin(), v.end(), greaterint());//默认情况下使用 less()排序规则从小到大for (vectorint::iterator it v.begin(); it ! v.end(); it) {cout *it ;}cout endl;return 0;
}总结关系仿函数中最常用的就是 greater 大于。
3.3 逻辑仿函数
功能描述
实现逻辑运算
仿函数原型
templateclass T bool logical_andT //逻辑与templateclass T bool logical_orT //逻辑或templateclass T bool logical_notT //逻辑非 逻辑仿函数在实际开发中是基本上用不着的作演示使用。 #include iostream
#include vector
#include functional//内建函数对象的头文件
#include algorithm
using namespace std;int main() {vectorbool v;v.push_back(true);v.push_back(false);v.push_back(true);v.push_back(false);v.push_back(false);for (vectorbool::iterator it v.begin(); it ! v.end(); it) {cout *it ;}cout endl;cout --------------------------------------------- endl;//利用逻辑非将容器 v 搬运到容器 v2 中并执行取反操作vectorbool v2;v2.resize(v.size());//目标容器必须提前开辟预定大小的空间否则报错transform(v.begin(), v.end(), v2.begin(), logical_notbool());//原容器的begin原容器的end目标容器的begin仿函数//把原容器中的数据都搬到目标容器中。//仿函数可以实现在搬运过程中做一些逻辑运算for (vectorbool::iterator it v.begin(); it ! v.end(); it) {cout *it ;}cout endl;return 0;
}transform(原容器的 begin, 原容器的 end, 目标容器的 begin, 仿函数); 把原容器中的数据都搬到目标容器中。仿函数可以实现在搬运过程中做一些逻辑运算目标容器必须提前开辟预定大小的空间否则报错 总结逻辑仿函数实际应用中较少了解即可