Function object (functor) | predicate | built-in functor

函数对象:
概念:
	重载安函数调用操作符的类,其对象常称为函数对象
	函数对象使用重载的()时,行为类似函数调用,也叫仿函数
本质:
	函数对象(仿函数)是一个类,不是一个函数。

特点:
	函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
	函数对象超出普通函数的概念,函数对象可以有自己的状态
	函数对象可以作为参数传递

谓词:
	·返回bool类型的仿函数称为谓词
	·如果operator()接受一个参数,那么叫做一元谓词
	·如果operator()接受两个参数,那么叫做两元谓词

内建函数对象:
	算术仿函数
	关系仿函数
	罗辑仿函数
用法:
	这些仿函数产生的对象,用法和一般函数完全相同
	使用内建函数对象,需要引入头文件#include<functional>

算术仿函数:
	实现四则运算
	其中negate是一元运算,其他都是二元运算
仿函数原型:
	template<class T> T plus<T>			//加法仿函数
	template<class T> T minus<T>		//减法仿函数
	template<class T> T multiplies<T>	//乘法仿函数
	template<class T> T divides<T>		//除法仿函数
	template<class T> T modulus<T>		//取模仿函数
	template<class T> T nagate<T>		//取反仿函数

关系仿函数:
	实现对比
	template<class T> T bool equal_to<T>		//等于
	tempalte<class T> T bool not_equal_to<T>	//不等于
	template<class T> T bool greater<T>			//大于
	template<class T> T bool greater_equal<T>	//大于等于
	template<class T> T bool less<T>			//小于
	template<class T> T bool less_equal<T>		//小于等于

逻辑仿函数:
	实现逻辑运算
	template<class T> bool logical_and<T>		//逻辑与
	template<class T> bool logical_or<T>		//逻辑或
	template<class T> bool logical_not<T>		//逻辑非
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>
#include <functional>

Function object:

class myAdd
{
    
    
	public:
		int operator()(int a, int b){
    
    
			return a + b;
		}
}; 

class myPrint
{
    
    
	public:
		myPrint(){
    
    
			this -> count = 0;
		}
		void operator()(string str){
    
    
			cout << str << endl;
			this -> count ++;
		}
	int count;
};

void doPrint(myPrint & mp, string str)
{
    
    
	mp(str);
}

void test1()
{
    
    
	//函数对象(仿函数)在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
	myAdd a;
	cout << a(10,30) << endl;
	//函数对象(仿函数)超出普通函数的概念,函数对象可以有自己的状态
	myPrint p;
	p("C++");
	p("C++");
	p("C++");
	p("C++");
	cout << "opertor()执行次数为 : " << p.count << endl;
	//函数对象(仿函数)可以作为参数传递
	doPrint(p, "仿函数作为参数传递");
	cout << "opertor()执行次数为 : " << p.count << endl; 
}

Predicate (unary):

class GreaterFive
{
    
    
public:
	bool operator()(int val) {
    
    
		return val > 5;
	}
};

void test2()
{
    
    
	vector<int> v;
	for (int i = 0; i < 10; i++) {
    
    
		v.push_back(i);
	}
	//查找容器中有没有大于5的数字
	//GreaterFive()匿名函数对象  在此作    pred  谓词
	vector<int> :: iterator it = find_if(v.begin(), v.end(), GreaterFive());
	if (it == v.end()) {
    
    
		cout << "未找到" << endl;
	}
	else {
    
    
		cout << "最先大于5的数字为:" << *it << endl;
	}
}

Predicate (binary):

class MyCompare
{
    
    
public:
	bool operator()(int val1, int val2) {
    
    
		return val1 > val2;
	}
};

bool myCompare(int val1, int val2)
{
    
    
	return val1 > val2;
}

void test3()
{
    
    
	vector<int> v;
	v.push_back(20);
	v.push_back(40);
	v.push_back(100);
	v.push_back(30);
	v.push_back(20);
	sort(v.begin(), v.end());
	for (vector<int> ::iterator it = v.begin(); it != v.end(); it++) {
    
    
		cout << *it << "  ";
	}
	cout << endl;
	//使用函数对象  改变算法策略,变为排序规则从大到小
	sort(v.begin(), v.end(), MyCompare());
	//sort(v.begin(), v.end(), myCompare);		//调用函数只需函数名
	cout << "******************************************" << endl;
	for (vector<int> ::iterator it = v.begin(); it != v.end(); it++) {
    
    
		cout << *it << "  ";
	}
	cout << endl;
}
void test4()
{
    
    
	//算术仿函数
	negate<int> n;
	cout << n(100) << endl;
	plus<int> p;
	cout << p(30, 20) << endl;
	//关系仿函数
	vector<int> v;
	v.push_back(20);
	v.push_back(40);
	v.push_back(100);
	v.push_back(30);
	v.push_back(20);
	sort(v.begin(), v.end());
	for (vector<int> ::iterator it = v.begin(); it != v.end(); it++) {
    
    
		cout << *it << "  ";
	}
	cout << endl;
	//使用函数对象  改变算法策略,变为排序规则从大到小
	//sort(v.begin(), v.end(), MyCompare());
	//sort(v.begin(), v.end(), myCompare);		//调用函数只需函数名
	//使用内建仿函数
	sort(v.begin(), v.end(), greater<int>());
	cout << "******************************************" << endl;
	for (vector<int> ::iterator it = v.begin(); it != v.end(); it++) {
    
    
		cout << *it << "  ";
	}
	cout << endl;
	//逻辑非仿函数
	vector<bool> v2;
	v2.push_back(true);
	v2.push_back(false);
	v2.push_back(true);
	v2.push_back(true);
	v2.push_back(false);
	for (vector<bool> ::iterator it = v2.begin(); it != v2.end(); it++) {
    
    
		cout << *it << "  ";
	}
	cout << endl;
	//利用逻辑非,将容器v2搬运到,容器v3中,并执行取反操作
	vector<bool> v3;
	v3.resize(v2.size());
	transform(v2.begin(), v2.end(), v3.begin(), logical_not<bool>());
	for (vector<bool> ::iterator it = v3.begin(); it != v3.end(); it++) {
    
    
		cout << *it << "  ";
	}
	cout << endl;
}
int main()
{
    
    
	test1();
	test2();
	test3();
	test4();
	system("pause");
	return 0;
}

*Dark horse programmer c++ course learning exercises

Guess you like

Origin blog.csdn.net/Fighting_gua_biu/article/details/114242278