假設我們有以下的一個類:
另外有一個包含 class A 對象的數組: vector vec;
如何對每一個類的對象調用成員函數print.
做法1: 利用下標
for(int i=0; i
做法2:利用迭代器for(vector::const_iterator it=vec.begin(); it!=vec.end(); ++it) { it->print(); }
做法3:C++11強大的 autofor(auto x : vec) { x.print(); }
有了C++11以後,做法3其實代碼已經非常短了,但是 effective STL 中的一個條款告訴我們,用STL的算法優先於自己手寫的循環。。比方說,這個問題就可以采用 for_each。。
原因如下:1. 效率: 算法通常比程序自己寫的循環效率更高(STL庫作者更加了解容器的底層實現,可以進行優化)
2. 正確性: 自己寫循環更容易出錯(代碼越少,越不容易出錯)
3. 可維護性:使用算法更為簡潔明了
做法4: 采用for_each
但是下面的代碼是否正確呢??
for_each(vec.begin(), vec.end(), &A::print); //無法通過編譯
編譯出錯,因為 print 是成員函數。。如果是普通的函數則沒有問題。。
for_each(vec.begin(), vec.end(), mem_fun_ref(&A::print));
如果是 vector 的話,就用 mem_fun即可。。其實 mem_fun 和 mem_fun_ref 是兩個模板函數,返回一個函數對象(包含上述的成員函數)。。