一、函数对象
1、函数对象就是重载了()的类,又叫函数符、仿函数,调用类似于普通函数,可以作为函数参数传递
2、
2、测试程序
#include"pch.h"
#include<iostream>
using namespace std;
//1、函数对象是重载了()的类,调用方式类似普通函数 仿函数
class MyPrint
{
public:
int m_count=0;
void operator()(int num)
{
cout << num << endl;
m_count++;
}
};
void myprint(int num)
{
cout << num << endl;
}
void test01()
{
//MyPrint(100);要先创建函数对象类,再调用
MyPrint m;
m(100);//调用函数对象
myprint(100);
}
//2、函数对象 超出普通函数的概念 内部可以拥有自己的状态
void test02()
{
MyPrint m;
m(100);
m(100);
m(100);
m(100);
cout << "总共打印的次数:" << m.m_count << endl;
}
//函数对象可以作为函数的参数
void doWork(MyPrint mp,int num)
{
mp(num);//调用重载的()函数,打印num
}
void test03()
{
doWork(MyPrint(), 1000);//匿名的函数对象作为参数
}
int main()
{
//test01();
//test02();
test03();
}
二、谓词
1、指普通函数或重载的operator()返回值是bool类型的函数对象
2、若operator接收一个参数就叫一元谓词,接收两个就叫二元谓词
3、谓词可作为一个判断式
4、案例测试
#include"pch.h"
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//谓词 普通函数 或函数符 返回值是bool类型
//一元谓词
class GreaterThen20
{
public:
bool operator()(int val)
{
return val > 20;
}
};
void test01()
{
vector<int>v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
//找到第一个大于20的数字
vector<int>::iterator it;
it=find_if(v.begin(), v.end(), GreaterThen20());
if (it != v.end())
{
cout << *it << endl;
}
else
{
cout << "fail." << endl;
}
}
//二元谓词
class MyCompare
{
public:
bool operator()(int v1, int v2)
{
return v1 > v2;
}
};
void test02()
{
vector<int>v;
v.push_back(10);
v.push_back(30);
v.push_back(20);
v.push_back(40);
//从大到小排序
sort(v.begin(), v.end(), MyCompare());//第三个参数如果是仿函数要放函数对象
//如果是回调函数放函数名即可不加()
// []() {} 匿名函数 lambda表达式 声明+参数+表达式
for_each(v.begin(), v.end(), [](int val) {cout << val << endl; });
}
int main()
{
//test01();
test02();
}
三、内建函数对象
1、由头文件functional包含的自带的函数对象
2、算数类函数对象除negate外其他都是二元运算,返回值为T类型数据
2.1 加法 plus、减法 minus、乘法 multiplies、除法 divides、 取模modulus、取反negate
3、关系运算类,每种都是二元运算,返回值为bool类型
3.1 等于 equal_to、不等于not_equal_to、大于 greater、 大于等于greater_equal、小于 less、小于等于less_equal
4、逻辑运算类 not为一元 其他都是二元 返回值为bool
4.1 逻辑与 logical_and、逻辑或logical_or、逻辑非logical_not
5、测试程序
#include"pch.h"
#include<iostream>
#include<functional>
#include<vector>
#include<algorithm>
using namespace std;
//template<clss T>T negate<T>//取反仿函数
void test01()
{
negate<int>n;
cout << n(10) << endl;//输出-10
}
//template<clss T>T plus<T>//加法仿函数
void test02()
{
plus<int>n;
cout << n(10,10) << endl;//输出20
}
//template<clss T>bool greater<T>//大于仿函数
void test03()
{
greater<int>n;
cout << n(10, 10) << endl;//输出0
vector<int>v;
v.push_back(10);
v.push_back(30);
v.push_back(50);
v.push_back(70);
v.push_back(60);
sort(v.begin(), v.end(), greater<int>());
for_each(v.begin(), v.end(), [](int val) {cout << val << endl; });
}
int main()
{
//test01();
//test02();
test03();
}