#include #include using namespace std; /* ispis genericke liste */ template void ispis(list l){ for(typename list::iterator it=l.begin(); it!=l.end(); it++){ cout<<(*it)< void ucitaj(list &l){ cout<<"Broj elemenata: "<>n; for(int i=0; i>x; l.push_back(x); } } template class Par{ private: T1 prvi; T2 drugi; public: Par(){} Par(T1 p, T2 d){ prvi = p; drugi = d; } void setPrvi(T1 pr){ prvi=pr; } void setDrugi(T2 dr){ drugi=dr; } ~Par(){} friend istream& operator>>(istream& in, Par &p){ in>>p.prvi; in>>p.drugi; return in; } friend ostream& operator<<(ostream& out, Par &p){ out<<"("< list< Par > spoji(list l1, list l2){ list< Par > l3; Par p1; typename list::iterator it1=l1.begin(); typename list::iterator it2=l2.begin(); /* idemo do duzine krace liste */ while(it1!=l1.end()&&it2!=l2.end()){ p1.setPrvi(*it1); p1.setDrugi(*it2); l3.push_back( p1 ); it1++; it2++; } return l3; } /* genericka funkcija koja menja zadatu listu tako sto zadrzava samo one elemente koji ispunjavaju prosledjeni uslov */ template void zadrzi( list& lista, bool(*uslov)(T)){ typename list::iterator it=lista.begin(); while(it!=lista.end()){ /* ovde je bitna inkrementacija it++ u erase pozivu kako bi se preslo na sledeci element liste. da je inkrementacija uradjena nakon erase poziva izgubila bi se referenca ka trenutnoj vrednosti pokazivaca, a samim tim i mogucnost prelaska na sledeci element liste, jer trenutni element ima pokazivac ka sledecem */ if(!uslov(*it)) lista.erase(it++); else it++; } } /* opstija varijanta funkcije zadrzi koja omogucava i prosledjivanje funkcionala */ template void zadrzi2( list& lista, Predikat p){ typename list::iterator it=lista.begin(); while(it!=lista.end()){ if(!p(*it)) lista.erase(it++); else it++; } } /* primer uslova za funkciju zadrzi */ bool u1(int x){ return x%2==0; } template < class T> class Linear{ private: float a; float b; public: Linear(float a1, float b1){ a=a1; b=b1; } Linear(){} /* operator () omogucava objektima ove klase da se ponasaju kao funkcije samo dodatno ovi objekti mogu da se parametrizuju dinamicki od strane korisnika u fazi izvrsavanja sto se ne moze postici pokazivacima na funkcije i statickim sablon promenljivama */ bool operator()(T x){ return (x*a+b)>0; } }; int main(int argc, char** argv) { Par p1(3,4); list l1; list l2; list< Par > l3; //testiramo ispis liste par cout<0 Linear lin1(2, -14); zadrzi2(l2, lin1); ispis(l2); return 0; }