我讀 C++ Standard Library: a Tutorial and Reference 後的筆記,主要內容來自 5.9小節,整個第八章,以及一些我自己的感想。 STL Algorithms C++ STL Algorithms 裡一系列操作容器的函數,我一直以來都覺得這系列函數異常的難用。例如萬年範例 -- for_each 逐一打印容器的元素: void print_int( int i ) { cout << i << endl; } for_each(v.begin(), v.end(), print_int); //逐一印出元素 乍看之下簡潔,但是這 for_each 有個致命的缺點,就是沒辦法傳入額外參數。例如我想對集合內的每個數值都加上一個固定值,用 for 迴圈再直覺不過: int value = 5; vector<int> ::iterator it; for(it=v.begin(); it!=v.end(); ++it) *it = *it + value; 這麼簡單的程式,想要改寫成for_each版本,馬上碰壁: void add_value( int & i ) { i = i + ???; // add something? } int main() { vector<int> v; for_each(v.begin(), v.end(), add_value); } 問號的地方只能放常數或者全域變數,而兩個選項都很爛,我真正想要的是從 main 裡面傳入一個變數。所以很長一段時間我把 for_each 封印起來,乖乖自己寫 for 迴圈。 Function Object 直到最近,我才明瞭到 function object 可能是這個惱人的問題的答案。 所謂的 function object 就是一個object,但是實做了operator() 。它實際上是物件,但可以當作函數來呼叫。要發揮整個 STL Algorithms 的威力,就一定要瞭解 function object。萬年打印範例用funciton object 來實作就會長這樣子 : class PrintInt{ vo...