STL 不僅讓複雜代碼編寫更輕鬆、更快速,還保證了代碼的標準化與高度優化。其設計精髓在於高度可配置:預設使用 operator< 排序,但現實場景中往往需要自訂比較邏輯——例如 State 類別沒有自然的「小於」定義,或需要降序排列。
inline bool popLess(const State& a, const State& b) {
return a.population() < b.population();
}
State aUnion[50];
std::sort(aUnion, aUnion + 50, popLess); // 按人口排序
缺點明顯:函數指標無法內聯,導致排序熱路徑上產生函數呼叫開銷,效率大打折扣。
struct PopLess : public std::binary_function<State, State, bool> {
bool operator()(const State& a, const State& b) const {
return a.population() < b.population();
}
};
std::sort(aUnion, aUnion + 50, PopLess()); // 匿名臨時物件
關鍵優勢:
operator() 使其可像函數一樣調用,STL 演算法模板同時接受函數指標與函數物件。std::binary_function 讓其他 STL 組件能在編譯期詢問參數/返回型別,支援泛型程式設計。operator() 內聯,編譯器知曉具體型別 PopLess,可將比較邏輯直接內聯進 sort 實例化代碼中,消除呼叫開銷。函數物件另一大用途是謂詞(一元判斷),設計原則與比較器一致:
struct IsWarm : public std::unary_function<State, bool> {
bool operator()(const State& a) const {
return a.aveTempF() > 60;
}
};
State* warmandsparse = std::find_if(aUnion, aUnion + 50, IsWarm());
在已按人口排序的陣列中,find_if 結合 IsWarm 輕鬆找出「氣候溫暖且人口較少」的州。
std::unary_function/binary_function 基類提供型別萃取支援。PopLess())比具名物件更簡潔、更符合慣例。函數物件是 STL 「高度可配置、零開銷抽象」哲學的典型體現,掌握其設計模式,能讓你寫出更高效、更通用的 C++ 代碼。