#include <algorithm> #include <list> #include <iostream> using namespace std; class equal_and_odd { public: bool operator()( int val1, int val2 ) { return ( val1 == val2 && ( val1 == 0 || val1 % 2 )); } }; /************************************************************************/ /* */ template<class _InIt1, class _InIt2/*, class _InItCats*/> inline bool __CLRCALL_OR_CDECL my_Equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2 /*,_InItCats, _Range_checked_iterator_tag*/) { // compare [_First1, _Last1) to [First2, ...) for (; _First1 != _Last1; ++_First1, ++_First2) if (!(*_First1 == *_First2)) return (false); return (true); } /************************************************************************/ /************************************************************************/ /* */ template<class _InIt1, class _InIt2, typename _Pr/*, class _InItCats*/> inline bool __CLRCALL_OR_CDECL my_Equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Pr _Pred /*,_InItCats, _Range_checked_iterator_tag*/) { // compare [_First1, _Last1) to [First2, ...) using _Pred for (; _First1 != _Last1; ++_First1, ++_First2) if (!_Pred(*_First1, *_First2)) return (false); return (true); } /************************************************************************/ int main() { int ia[] = { 0,1,1,2,3,5,8,13 }; int ia2[] = { 0,1,1,2,3,5,8,13,21,34 }; bool res; // true: both are equal to the length of ia. // generates: int ia[7] equal to int ia2[9]? true. res = my_Equal( &ia[0], &ia[7], &ia2[0] ); cout << "int ia[7] equal to int ia2[9]? " << ( res ? "true" : "false" ) << "./n"; list<int> ilist(ia, ia + 7); list<int> ilist2( ia2, ia2 + 9 ); // generates: list ilist equal to ilist2? true. res = my_Equal( ilist.begin(), ilist.end(), ilist2.begin() ); cout << "list ilist equal to ilist2? " << ( res ? "true" : "false" ) << "./n"; // false: 0, 2, 8 are not equal and odd // generates: list ilist equal_and_odd() to ilist2? false. res = my_Equal( ilist.begin(), ilist.end(), ilist2.begin(), equal_and_odd() ); cout << "list ilist equal_and_odd() to ilist2? " << ( res ? "true" : "false" ) << "./n"; return 0; }