库里面的for_each源码 ---------------------------------------------------------------------------------------- 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, _InIt _Last, _Fn1 _Func) { // perform function for each element _DEBUG_RANGE(_First, _Last); _DEBUG_POINTER(_Func); return (_For_each(_Unchecked(_First), _Unchecked(_Last), _Func)); }
------------------------------------------------------------------------------------- void myfunctions(int i) { cout<<" "<<i; } //------------------------------------------- struct myclass { void operator()(int i) { cout<<" "<<i; } }myobject; //-------------------------------------------- class Meanvalue { public: Meanvalue():num(0),sum(0){} void operator()(int elem) { num++; sum +=elem; } double vlaue() { return static_cast<double>(sum)/static_cast<double>(num); } operator double() { return static_cast<double>(sum)/static_cast<double>(num); } private: long num; long sum; }; template<class T> class AddValue { public: AddValue(const T& v):thevalue(v){} void operator()(T& elem) { elem += thevalue;//这里交换一下就会不一样 } private: T thevalue; }; int main() { vector<int>myvector; myvector.push_back(10); myvector.push_back(20); myvector.push_back(30); //cout<<"myvector contains"<<endl; //for_each(myvector.begin(),myvector.end(),myfunctions); //-------------------------------------------------------- cout<<"classmyvector contains"<<endl; for_each(myvector.begin(),myvector.end(),myobject); cout<<endl; //-------------------------------------------------------- //Meanvalue mv = for_each(myvector.begin(),myvector.end(),Meanvalue());//Meanvalue()相当于Meanvalue.operator()(*p) //cout<<mv.vlaue()<<endl; //----------------------------------------------------------- for_each(myvector.begin(),myvector.end(),AddValue<int>(10)); for_each(myvector.begin(),myvector.end(),myobject); cout<<endl; return 0; }