在 C++ 中,仿函数 (functor) 是一種特殊的類別,其封裝了一個重載了「括號運算子」的函數,可以像使用普通函數一樣使用仿函數。
1. 基本方式:
以下是一個簡單的仿函數範例,可以將其用於加總兩個數字:
#include <iostream>
class AdditionFunctor {
public:
// 重載括號運算子
int operator()(int a, int b) const {
return a + b;
}
};
int main() {
AdditionFunctor add;
std::cout << add(3, 4) << std::endl; // 輸出 7
return 0;
}
在這個例子中,AdditionFunctor 是一個仿函數類別,其封裝了一個重載了「括號運算子」的函數。在 main 函數中,我們可以透過將 add 實例當作函數來呼叫,例如 add(3, 4)。
2. STL中
以下是一個使用仿函數與 STL 的例子,可以將一個 vector 中的所有數字加總:
#include <iostream>
#include <vector>
class SumFunctor {
public:
// 重載括號運算子
int operator()(const std::vector<int>& v) const {
int sum = 0;
for (int i : v) {
sum += i;
}
return sum;
}
};
int main() {
std::vector<int> v{1, 2, 3, 4, 5};
SumFunctor sum;
std::cout << sum(v) << std::endl; // 輸出 15
return 0;
}
在這個例子中,SumFunctor 是一個仿函數類別,其封裝了一個重載了「括號運算子」的函數,可以將 vector 中的所有數字加總。在 main 函數中,我們可以透過將 sum 實例當作函數來呼叫,例如 sum(v)。
C++ 中的仿函数(functor)是一种对象,它能够像函数一样调用,可以用来替代函数指针。与函数指针相比,仿函数更加灵活,因为它可以存储状态。
仿函数常常用于需要将函数作为参数的地方,例如在 STL 中的算法,如 sort、for_each、transform 等。例如,下面的代码使用了仿函数 greater<int> 对数组进行排序:
#include <algorithm>
#include <functional>
#include <iostream>
using namespace std;
int main() {
int a[5] = {3, 2, 5, 1, 4};
sort(a, a + 5, greater<int>());
for (int i = 0; i < 5; ++i) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}
输出:
5 4 3 2 1
另一个常见的用途是将仿函数用作事件处理函数。例如,如果你有一个窗口类,可以让它的用户设置一个仿函数作为按钮点击事件的处理函数。这样用户就可以在不修改窗口类的源代码的情况下,使用自己的代码来处理按钮点击事件。
总之,仿函数是一种非常灵活的工具,可以用来替代函数指针,并且提供了更多的灵活性。