1. 程式人生 > >Effective_STL 學習筆記(四十六) 考慮使用函數對象代替函數做算法的參數

Effective_STL 學習筆記(四十六) 考慮使用函數對象代替函數做算法的參數

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 學習筆記(四十六) 考慮使用函數對象代替函數做算法的參數