首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 函數對象實戰指南:從定義到 STL 演算法應用

     編輯:C++ 入門

函數對象的三種形態

廣義函數對象泛指「可像函數一樣調用」的實體:

  1. 一般函數
  2. 函數指標
  3. 重載 operator() 的類別實例(狹義函數對象)

基本定義與使用

// 1. 一般函數
void print(int x) {
    if (x >= 0 && x <= 100) cout << x << " ";
}

// 2. 函數指標
typedef void(*ptPrint)(int);
ptPrint prt = print;

// 3. 仿函數類別 (一元謂詞)
class isOk {
public:
    bool operator()(int val) {
        return !(val < 0 || val > 100);
    }
};

STL 演算法實戰應用

vector<int> vecA = { -5, 10, 50, 150, 200 };
vector<bool> vecB(vecA.size());

// for_each: 列印 0~100 間的數
for_each(vecA.begin(), vecA.end(), print); 

// transform: 判斷範圍,結果存入 vecB
transform(vecA.begin(), vecA.end(), vecB.begin(), isOk());
// vecB 對應為: false, true, true, false, false

參數分類與繼承體系

  • 無參函數對象:operator()()
  • 一元函數對象:operator()(Arg),繼承 unary_function<Arg, Result> (C++11 棄用,但概念仍在)
  • 二元函數對象:operator()(Arg1, Arg2),繼承 binary_function<Arg1, Arg2, Result>

自定義類別配合排序

class Grade {
public:
    Grade(int id, string name, int score) : ID(id), Name(name), Score(score) {}
    int ID; string Name; int Score;
};

// 依 Score 排序的二元謂詞
struct ScoreLess {
    bool operator()(const Grade& a, const Grade& b) const {
        return a.Score < b.Score;
    }
};

// 使用
vector<Grade> grades = { {1,"A",80}, {2,"B",90}, {3,"C",70} };
sort(grades.begin(), grades.end(), ScoreLess());

關鍵提醒

文章提到的「虛函數表實現」描述不準確:函數對象調用靜態綁定(除非透過基類指標),operator() 非虛函數時無 vtable 開銷,這正是其高效能來源之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved