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

for_each詳解

編輯:C++入門知識

說明:在使用STL算法庫的過程中,如果單單就某個函數做一些使用,而不了解其內部的實現原理,在使用過程中將會存在大量的"問題",因此,在最近這段時間裡,我將對每個函數深入挖掘
定義(vs2010 stl版本)
函數功能:對區間[beg,end)執行_Fn1.並返回_Fn1.
template<class _InIt,
         class_Fn1> inline
         _Fn1 _For_each(_InIt _First, _InIt_Last, _Fn1 _Func)
         {       // perform function for each element
         for (;_First != _Last; ++_First)
                   _Func(*_First);
         return(_Func);
         }
 
template<class _InIt,
         class_Fn1> inline
         _Fn1 for_each(_InIt _First,                //start interval
_InIt _Last,      //endinterval,即[_First,_Last)
 _Fn1_Func)   //function object or function(unary_function)
         {       // perform function for each element
         _DEBUG_RANGE(_First, _Last);
         _DEBUG_POINTER(_Func);
         return(_For_each(_Unchecked(_First), _Unchecked(_Last), _Func));
         }
注意:for_each返回仿函數(即當時傳遞進去的仿函數),不過狀態可能改變了.
有了這個函數的定義,使用就簡單了.
template<typenameT>
class OperatorValue
{
private:
         T _value;
public:
         OperatorValue( T value ):_value( value){}
         void operator()( T element )
         {
                   cout<<element<<" ";
                   _value += element;
         }
         T returnValue()
         {
                   return_value;
         }
};
int main()
{
         vector<int>vecInt;
         vecInt.push_back( 2 );
         vecInt.push_back( 5 );
         vecInt.push_back( 7 );
         vecInt.push_back( 3 );
         OperatorValue<int> val = for_each(vecInt.begin(),vecInt.end(),OperatorValue<int>(0 ));
         cout<<"\n"<<val.returnValue();
         system( "pause");
         return0;
}
需要說明的是:
1)       可以在operator()中使用引用參數,這樣就可以修改元素的值.但這種方法並不可取.如果需要修改元素的值,你應該使用transform.
2)       for_each的返回值之所以有用,完全是因為它是仿函數而給一般的函數(前者有狀態,而後者沒有).
3)       在函數的使用過程中仿函數的狀態時改變的.但這種改變對for_each操作不產生”異常”(關於這一點,請參看我的另一篇博客:點擊打開鏈接)



摘自 yuanweihuayan的專欄

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