概念:
仿函数即是对 “()” 的重载,因为其调用方式很像函数,因此被称为仿函数。
举例:
class myAdd
{
public:
//定义仿函数,表示要对两个数进行相加
int operator()(int v1,int v2)
{
return v1+v2;
}
}
int main()
{
myAdd add;
int result=add(10,10);//调用仿函数
cout << result << endl;
}
输出结果为20
案例:
//定义一个类,数据成员包括姓名、年龄、身高。按照年龄对他们进行排序,年龄相同的,再按照身高进行排序。
#include <iostream>
#include <list>
using namespace std;
//定义类
class Person
{
public:
Person(string n,int a,int h)
{
this->name=n;
this->age=a;
this->high=h;
};
string name;
int age=0;
int high=0;
};
//写一个仿函数,指定排序规则
bool sort_rule(Person& p1,Person& p2)
{
//按年龄升序排列;年龄相同的按身高升序排列
if(p1.age==p2.age)
{
return p1.high < p2.high;//表示“前”小于“后”为真,下同
}
return p1.age < p2.age;
}
int main()
{
//创建容器
list<Person>L;
//创建对象
Person p1('a',25,175);
Person p2('b',27,180);
Person p3('c',30,170);
Person p4('d',25,190);
Person p5('e',21,175);
Person p6('f',25,178);
//插入链表
L.push_back(p1);
L.push_back(p2);
L.push_back(p3);
L.push_back(p4);
L.push_back(p5);
L.push_back(p6);
//调用排序函数:参数加上仿函数名称即可
L.sort(sort_rule);
//使用迭代器遍历输出
for(list<Person>::iterator it=L.begin();it!=L.end();it++)
{
cout << "姓名:" << (*it).name << ",年龄:" << (*it).age << ",身高:" << (*it).high << endl;
}
return 0;
}
输出结果为:
姓名:e,年龄:21,身高:175
姓名:a,年龄:25,身高:175
姓名:f,年龄: 25,身高:178
姓名:d,年龄:25,身高:190
姓名:b,年龄:27,身高:180
姓名:c,年龄:30,身高:170