函数对象

概念:

  • 重载【函数调用操作符】的类,其对象称为函数对象
  • 函数对象使用重载的()时,也叫仿函数

本质:

  • 函数对象是一个类,不是一个函数

使用:

  • 可以像普通函数一样,有参数和返回值
  • 可以有自己的状态
  • 可以作为参数传递
class myprint{
public:
  	myprint(){
    	this->count=0;
    }
  	void operator()(string test){
    	cout<<test<<endl;
      	this->count++;
    }
  	int count;
}
//count就是一个内部状态

void doprint(myprint &mp,string test){//myprint可作为参数传递
	mp(test);
}
void test(){
	myprint p;
	doprint(p,"hello");
}

谓词

概念:

  • 返回bool类型的仿函数称为谓词
  • 如果operator()接收一个参数,叫一元谓词
  • 如果operator()接收两个参数,叫二元谓词
class greaterFive
{
public:
  	bool operator()()
    {
    	return val>5;
    }
};
void test()
{
	vector<int> v;
  for(int i=0;i<10;i++)
  {
  	v.push_back(i);
  }
  
  //查找容器中有无大于5的数组
  find_if(v.begin(),v.end(),greaterFive());//greaterFive()匿名函数对象
}

内建函数对象

头文件:#include <functional>

算术仿函数

实现四则运算

#include <functional>

void test()
{
	negate<int>n;//取反仿函数,一元
  	n(50);//结果为-50
  	
  	plus<int>p;
  	p(10,10);//20
}

关系仿函数

实现关系对比

//用大于举例说明
vector<int>v;
v.push_back(10);
v.push_back(20);
v.push_back(30);

sort(v.begin(),v.end(),greater<int>());//使用内建的函数对象实现从大到小排序

逻辑仿函数

#include<algorithm>
#include<functional>

vector<bool>v;
v.push_back(true);
v.push_back(false);
v.push_back(true);

vector<bool>v2;
v2.resize(v.size());
transform(v.begin(),v.end(),v2.begin(),v2.end(),logical_not<bool>());//将第一个容器的数据搬到第二个容器,同时进行取反