Abstract
for_each()是STL中少數可以回傳值的algorithm,此範例在展示for_each()此特殊功能與function object可以留住state的特性。

Introduction
function object與global function的差別除了function object可以傳入參數外,還可以不使用static就可以留住state。

一個簡單的需求,想要每印n個數字就換行,並且統計出所有iterator的和,所以function object必須能留住state才知道目前印了幾個數字,且統計sum為多少。

Sample Code

 1}



執行結果

(原創) 如何使for_each()傳回值? (C/C++) (STL)0 1 2 3 4
(原創) 如何使for_each()傳回值? (C/C++) (STL)
5 6 7 8 9
(原創) 如何使for_each()傳回值? (C/C++) (STL)
10 11 12 13 14
(原創) 如何使for_each()傳回值? (C/C++) (STL)
15 16 17 18 19
(原創) 如何使for_each()傳回值? (C/C++) (STL)sum is 
190


17行

(原創) 如何使for_each()傳回值? (C/C++) (STL)private:
(原創) 如何使for_each()傳回值? (C/C++) (STL)  
int _n;
(原創) 如何使for_each()傳回值? (C/C++) (STL)  
int _cnt;
(原創) 如何使for_each()傳回值? (C/C++) (STL)  
int _sum;


_n為設定幾個字跳行
_cnt統計目前已經印了幾個字
_sum統計目前加總結果

29行

(原創) 如何使for_each()傳回值? (C/C++) (STL)if (_cnt % _n) 
(原創) 如何使for_each()傳回值? (C/C++) (STL)  cout 
<< elem << " ";
(原創) 如何使for_each()傳回值? (C/C++) (STL)
else
(原創) 如何使for_each()傳回值? (C/C++) (STL)  cout 
<< elem << endl;


若每印n個字,就加印換行

35行

}


為了讓for_each()能傳回值,特別改寫operator int(),讓function object能夠傳回值。

46行

(原創) 如何使for_each()傳回值? (C/C++) (STL)int sum = for_each(ivec.begin(), ivec.end(), printElem(5));


這樣for_each()就能風風光光的每n個字就換行,還可以順便加總結果。

Conclusion
STL真的很神奇,以上的程式想一行一行翻成C#還真的做不到呢!!

See Also
(原創) 如何正確的使用迴圈(使用for_each)? (C/C++) (STL) (template)

Reference
Nicolai M. Josuttis,The C++ Standard Library : A Tutorial and Referencd,Addison Wesley,1999

相关文章: