C++學習隨筆——C++仿函式的應用方法

北宸于烁發表於2024-08-27

仿函式的基本定義

仿函式(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;
}

相關文章