程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ mem_fun 和 mem_fun_ref 的用法

C++ mem_fun 和 mem_fun_ref 的用法

編輯:C++入門知識

假設我們有以下的一個類:



另外有一個包含 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強大的 auto

for(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 是兩個模板函數,返回一個函數對象(包含上述的成員函數)。。




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved