// Feladat: keressük az első előfordulást... int t[] = { 1, 3, 5, ... }; int *pi = find( t, t+sizeof(t)/sizeof(t[0]), 55); if ( pi ) { *pi = 56; } // Egy nagyon specifikus find(): int *find( int *begin, int *end, int x) { while ( begin != end ) { if ( *begin == x ) { return begin; } ++begin; } return 0; } // Általánosítsunk a típuson: int -> T template <typename T> T *find( T *begin, T *end, const T& x) { while ( begin != end ) { if ( *begin == x ) { return begin; } ++begin; } return 0; } // Általánosítsunk az adatszerkezeten: ++, * template <typename It, typename T> It find( It begin, It end, const T& x) { while ( begin != end ) { if ( *begin == x ) { return begin; } ++begin; } return end; } // Egységes használat: int t[] = { 1, 3, 5, ... }; int *pi = find( t, t+sizeof(t)/sizeof(t[0]), 55); if ( pi ) { *pi = 56; } vector<int> v; v.push_back(1); v.push_back(3); v.push_back(5); ... vector<int>::iterator vi = find( v.begin(), v.end(), 55); if ( vi != v.end() ) { *vi = 56; } list<double> l; l.push_back(1.1); l.push_back(3.3); l.push_back(5.5); ... list<double>::iterator li = find( l.begin(), l.end(), 55.55); if ( li != l.end() ) { *li = 56.66; } // Konstans-biztosság: const int t[] = { 1, 3, 5, ... }; const int *pi = find( t, t+sizeof(t)/sizeof(t[0]), 55); if ( pi ) { // *pi = 56; Syntax error cout << *pi; } vector<int> v; v.push_back(1); v.push_back(3); v.push_back(5); ... const list<double> cl( v.begin(), v.end()); list<double>::const_iterator cli = find( cl.begin(), cl.end(), 55.55); if ( cli != cl.end() ) { // *cli = 56.66; Syntax error cout << *cli; } // Keressük meg a harmadik előfordulást: list<double> l; ... list<double>::iterator li; li = find( l.begin(), l.end(), 3.14); li = find( li, l.end(), 3.14); li = find( li, l.end(), 3.14); // vagy: li = find(find(find(l.begin(),l.end(),3.14),l.end(),3.14),l.end(),3.14); // Keressük meg a harmadik elemet, amelyik kisebb 55-nél: template <typename It, typename Pred> It find_if( It begin, It end, Pred p) { while ( begin != end ) { if ( p(*begin) ) { return begin; } ++begin; } return end; } // Predikátum I. (nem túl jó): bool less55_3rd( int x) { static int cnt = 0; if ( x < 55 ) ++cnt; return 3 == cnt; } // Használat: vector<int> v; ... vector<int>::iterator = find_if( v.begin(), v.end(), less55_3rd); // Predikátum II: struct less55_3rd { less55_3rd() : cnt(0) { } bool operator()(int x) { if ( x < 55 ) ++cnt; return 3 == cnt; } private: int cnt; }; // Használat: vector<int> v; ... less55_3rd pp; vector<int>::iterator = find_if( v.begin(), v.end(), pp); // vagy: vector<int>::iterator = find_if( v.begin(), v.end(), less55_3rd()); // Predikátum III.: általánosabban template <typename T> struct less_nth { less_nth( const T& t, int n) : t_(t), n_(n), cnt_(0) { } bool operator()(const T& t) { if ( t < t_ ) ++cnt; return n_ == cnt; } private: T t_; int n_; int cnt_; }; // Használat: vector<int> v; ... vector<int>::iterator = find_if(v.begin(),v.end(),less_nth<int>(55,3));