仿函式的基本定義
仿函式(Functor),也稱為函式物件(Function Object),是一個行為像函式的物件。實現仿函式的方法是過載類中的 operator() 運算子,使得物件能夠像呼叫普通函式一樣使用。仿函式的主要優勢是它們可以擁有狀態,並且可以被用於 STL 演算法和容器中。
簡單例子:
點選檢視程式碼
#include <iostream>
class Adder {
public:
// 過載 () 運算子
int operator()(int a, int b) const {
return a + b;
}
};
int main() {
Adder add; // 建立 Adder 物件
int result = add(3, 4); // 像呼叫函式一樣使用物件
std::cout << "Result: " << result << std::endl; // 輸出 Result: 7
return 0;
}
用於 STL 演算法:
點選檢視程式碼
#include <iostream>
#include <vector>
#include <algorithm>
// 定義一個仿函式,用於判斷兩個整數的大小
class GreaterThan {
public:
bool operator()(int a, int b) const {
return a > b;
}
};
int main() {
std::vector<int> vec = {3, 1, 4, 1, 5, 9};
// 使用仿函式 GreaterThan 對 vector 進行降序排序
std::sort(vec.begin(), vec.end(), GreaterThan());
// 輸出排序後的 vector
for (int n : vec) {
std::cout << n << " ";
}
std::cout << std::endl; // 輸出: 9 5 4 3 1 1
return 0;
}
保持狀態的仿函式:
點選檢視程式碼
#include <iostream>
#include <vector>
#include <algorithm>
// 定義一個仿函式,用於計算累計和
class Accumulator {
private:
int total;
public:
Accumulator() : total(0) {}
void operator()(int n) {
total += n;
}
int getTotal() const {
return total;
}
};
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
Accumulator acc = std::for_each(vec.begin(), vec.end(), Accumulator());
std::cout << "Total sum: " << acc.getTotal() << std::endl; // 輸出: Total sum: 15
return 0;
}
引數化的行為:
點選檢視程式碼
#include <iostream>
class Multiply {
private:
int factor;
public:
// 建構函式
Multiply(int f) : factor(f) {}
// 過載 () 運算子
int operator()(int x) const {
return x * factor;
}
};
int main() {
Multiply timesTwo(2); // 建立一個乘以2的仿函式
Multiply timesThree(3); // 建立一個乘以3的仿函式
std::cout << "2 * 4 = " << timesTwo(4) << std::endl; // 輸出 2 * 4 = 8
std::cout << "3 * 4 = " << timesThree(4) << std::endl; // 輸出 3 * 4 = 12
return 0;
}