Effective_STL 學習筆記(四十六) 考慮使用函數對象代替函數做算法的參數
阿新 • • 發佈:2018-12-02
color 函數 ive leg 假設 指針 學習 編譯器 內聯
STL 函數對象——化妝成函數的對象——傳遞給算法所產生的代碼比一般傳遞真的函數高效
假設需要以降序排序一個 double 的 vector,最直接的 STL 方式是通過 sort 算法和 greater<double> 類型的函數對象:
1 vector<double> v; 2 . . . 3 sort( v.begin(), v.end(), greater<double>() );
避開函數對象而使用真的函數,一個真的內聯函數:
1 inline bool doubleGreater(double d1, double d2)2 { 3 return d1 > d2; 4 } 5 . . . 6 sort( v.begin(), v.end(), doubleGreater );
其中,greater<double>::operator() 是一個內聯函數,編譯器實例化 sort 時內聯展開它,結果 sort 沒有包含一次函數調用
對於使用 doubleGreater 調用的 sort 的情況不同。在函數傳遞時,不可能把一個函數作為參數傳給另一個函數,編譯器默認把函數轉換為指向那個函數的指針:
1 sort( v.begin(), v.end(), doubleGreater ); //傳遞了一個 doubleGreater 指針
每次在 sort 調用時,編譯器產生一個間接函數調用——通過函數指針調用
把函數對象作為算法的參數帶來的不僅是巨大的效率提升。在讓你的代碼可以編譯方面,它們更加穩健。當然真函數很有用,但當涉及有效的 STL 編程時,函數對象經常更有用。
Effective_STL 學習筆記(四十六) 考慮使用函數對象代替函數做算法的參數