文章目录
1. 概念
模仿函数的类,使用方式如同函数。本质是类中重载括弧运算符operator()
。
2. 场景
不同函数复用相同处理代码。
(***)3. 仿函数+模板+STL
3.1. 仿函数作为set类的比较操作模板
(1)在模板参数中添加仿函数类可以改变set升降序,实质:重载()运算符
//class
class Greator{
//(1) 在模板参数中添加仿函数类可以改变set升降序;
public:
bool operator()(int a,int b){
return a > b;
}
};
//main()
set<int,Greator> s; // 在模板参数中添加仿函数类可以改变set升降序
(2)可以多定义几个仿函数类,用来调用主类的成员函数;
//class
class AgeComp{
//(2)可以多定义几个仿函数类,用来调用主类的成员函数;
public:
bool operator()(const Student& a,const Student& b){
return a.GetAge() > b.GetAge();
}
};
class ScoreComp{
//(2)可以多定义几个仿函数类,用来调用主类的成员函数;
public:
bool operator()(const Student& a,const Student& b){
return a.GetScores() < b.GetScores();
}
};
//main()
set<Student,AgeComp> stu = {
Student("张三",21,89),
Student("李四",19,78),
Student("王五",20,69)
};
Print(stu);
set<Student,ScoreComp> stu2(stu.begin(),stu.end()); //(2)仿函数的调用:实质:重载()运算符;
(完整代码 见001_fangfunc_.cpp)
#include <set>
#include <vector>
#include <iostream>
using namespace std;
//(1) 在模板参数中添加仿函数类可以改变set升降序;
//(2)可以多定义几个仿函数类,用来调用主类的成员函数;
template<typename T,typename S>
void Print(const set<T,S>& s){
for(auto n:s){
cout << n << " ";
}
cout << endl;
}
class Greator{
//(1) 在模板参数中添加仿函数类可以改变set升降序;
public:
bool operator()(int a,int b){
return a > b;
}
};
class Student{
string name;
int age;
float scores;
public:
Student(const string& name,int age,float scores):name(name),age(age),scores(scores){
}
int GetAge()const{
return age;}
float GetScores()const{
return scores;}
friend ostream& operator<<(ostream& os,const Student& s){
return os << s.name << ',' << s.age << ',' << s.scores;
}
};
class AgeComp{
//(2)可以多定义几个仿函数类,用来调用主类的成员函数;
public:
bool operator()(const Student& a,const Student& b){
return a.GetAge() > b.GetAge();
}
};
class ScoreComp{
//(2)可以多定义几个仿函数类,用来调用主类的成员函数;
public:
bool operator()(const Student& a,const Student& b){
return a.GetScores() < b.GetScores();
}
};
int main(){
set<int,Greator> s; // 在模板参数中添加仿函数类可以改变set升降序
s = {
10,2,2,2,2,13,4,15,6};
// 数据有序
// 数据唯一
Print(s);
set<Student,AgeComp> stu = {
Student("张三",21,89),
Student("李四",19,78),
Student("王五",20,69)
};
Print(stu);
set<Student,ScoreComp> stu2(stu.begin(),stu.end()); //(2)仿函数的调用:实质:重载()运算符;
Print(stu2);
}
3.2 函数指针的应用
(1)常用函数指针,实现数据的批量处理;声明的写法;
typedef void (*func_t)(int& n); //a.常用函数指针,实现数据的批量处理;
void Travel(vector<int>& vec, func_t func){
//声明的写法;
for(auto& n:vec){
func(n);
}
}
(2)调用的写法,多个函数并用;
Travel(vec,Double); //b。调用的写法,多个函数并用;
(完整代码见002_func_pointer.cpp)
#include <iostream>
#include <vector>
using namespace std;
void