#include <algorithm> #include <list> #include <iostream> using namespace std; class even_by_twos { public: even_by_twos(int seed = 0):_seed(seed){} int operator()(){ return _seed += 2;} private: int _seed; }; template <typename Type> void print_element(Type elem) { cout << elem << " "; } /************************************************************************/ /* */ template<class _OutIt, class _Diff, class _Fn0, class _OutItCat> inline void my_generate_n(_OutIt _Dest, _Diff _Count, _Fn0 _Func/*, _OutItCat, _Range_checked_iterator_tag*/) { // replace [_Dest, _Dest + _Count) with _Func() _DEBUG_POINTER(_Dest); _DEBUG_POINTER(_Func); for (; 0 < _Count; --_Count, ++_Dest) *_Dest = _Func(); } /************************************************************************/ int main() { list<int> ilist(10); void (*pfi)(int) = print_element; generate_n(ilist.begin(), ilist.size(), even_by_twos()); cout << "generate_n with even_by_twos();/n"; for_each(ilist.begin(), ilist.end(), pfi); generate_n(ilist.begin(), ilist.size(), even_by_twos(100)); cout << "generate_n with even_by_twos(100);/n"; for_each(ilist.begin(), ilist.end(), pfi); return 0; } 以下是generate(); #include <algorithm> #include <list> #include <iostream> using namespace std; int odd_by_twos() { static int seed = -1; return seed += 2; } template <typename Type> void print_element(Type elem) { cout << elem << " "; } /************************************************************************/ /* */ template<class _FwdIt, class _Fn0> inline void my_generate(_FwdIt _First, _FwdIt _Last, _Fn0 _Func) { // replace [_First, _Last) with _Func() _DEBUG_RANGE(_First, _Last); _DEBUG_POINTER(_Func); for (; _First != _Last; ++_First) *_First = _Func(); } /************************************************************************/ int main() { list<int> ilist(10); void (*pfi)(int) = print_element; generate(ilist.begin(), ilist.end(), odd_by_twos); cout << "elements within list the first invocation"; for_each(ilist.begin(), ilist.end(), pfi); generate(ilist.begin(), ilist.end(), odd_by_twos); cout << "elements within list the second invocation"; for_each(ilist.begin(), ilist.end(), pfi); return 0; }