函数指针和仿函数
函数指针
定义
函数指针 的本质是一个指针,该指针的地址指向了一个函数,所以它是指向函数的指针。函数的定义是存在于代码段,因此,每个函数在代码段中,也有着自己的入口地址,函数指针就是指向代码段中函数入口地址的指针。
函数指针的定义公式:
ReturnType表示的是返回值的类型,Ptr是函数指针的名字,par表示传入函数参数
ReturnType (*Ptr)(par1,par2...);
初始化和调用
让指针等于函数的名称,然后直接利用函数指针来调用函数
Ptr = FuncName;
Ptr(par1,par2);
示例代码
#include <iostream>
#include <map>
using namespace std;
int findMax(int a, int b) {
return a > b ? a : b;
}
int main() {
int (*ptr)(int, int);
ptr = findMax;
cout << ptr(10, 20) << endl;
return 0;
}
回调函数
回调函数就是一个通过指针函数调用的函数。其将函数指针作为一个参数,传递给另一个函数。
回调函数并不是由实现方直接调用,而是在特定的事件或条件发生时由另外一方来调用的。
举例:
#include <iostream>
#include <map>
using namespace std;
int findMax(int a, int b) {
return a > b ? a : b;
}
int callback(int a,int b,int (*ptr)(int,int) ) {
cout << "这里调用了函数指针,回调函数调用成功" << endl;
return (*ptr)(a,b);
}
int main() {
int (*ptr)(int, int);
ptr = findMax;
cout << callback(10, 20, findMax) << endl;
return 0;
}
总结:
在这个回调函数的调用过程,我们回调函数callback不需要去关心findMax的函数是如何被实现的,比如之后findmax函数的功能修改了,我们可以不动callback函数
仿函数
仿函数的语法几乎和我们普通的函数调用一样,不过作为仿函数的类,都必须重载 operator() 运算符。因为调用仿函数,实际上就是通过类对象调用重载后的 operator() 运算符。
演示一下仿函数的一种使用方式,其实和函数指针很类似,但是在算法中调用比较方便
#include <iostream>
#include <vector>
using namespace std;
class IsGreaterThanThresholdFunctor {
public:
explicit IsGreaterThanThresholdFunctor(int t) :threshold(t) {}
bool operator() (int num) const {
return num > threshold ? true : false;
}
private:
const int threshold;
};
int RecallFunc(vector<int> &arr, IsGreaterThanThresholdFunctor myFunctor) {
int count = 0;
for (int i = 0; i != arr.size(); i++) {
count = myFunctor(arr[i]) ? ++count : count;
}
return count;
}
int main() {
vector<int> arr;
arr.push_back(15);
arr.push_back(20);
arr.push_back(30);
arr.push_back(5);
arr.push_back(0);
int result = RecallFunc(arr, IsGreaterThanThresholdFunctor(10));
cout << result << endl;
}
如何在算法中调用,比较方便
就是要注意一下sort函数的传入参数不要错就ok
#include <iostream>
#include <vector>
using namespace std;
#include <algorithm>
bool Mysort(int a, int b) {
return a > b;
}
void PrintArr(int *arr,int len) {
for (int i = 0; i < len; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int len = sizeof(arr) / sizeof(arr[0]);
PrintArr(arr, len);
sort(arr,arr+len, Mysort);
PrintArr(arr, len);
return 0;
}