Ĺadny brzuch
Na c++reference.com na temat binary_search jest coś takiego
#include <algorithm>
bool binary_search( iterator start, iterator end, const TYPE& val );
bool binary_search( iterator start, iterator end, const TYPE& val, Comp f );
Pierwszą definicję rozumiem, ale z druga mam problem. Ostatni parametr to wskaźnik do funkcji porównującej elementy kontenera. Napisałem taki oto kod, w którym chciałem pobawic się binary_search
#include <iostream> #include <algorithm> #include <list> using namespace std; struct xxx { int pole1; int pole2; }; bool cmp(xxx obj1, xxx obj2) { return (obj1.pole1 < obj2.pole1); } int main() { list<xxx> lista; xxx a, b, c, d; a.pole1 = 1; a.pole2 = -1; b.pole1 = 3; b.pole2 = -3; c.pole1 = 100; c.pole2 = -100; d.pole1 = 6; d.pole2 = -6; lista.push_back(a); lista.push_back(b); lista.push_back(c); lista.push_back(d); //if(binary_search(lista.begin(), lista.end(), 6, cmp)) cout << "Jest"; }
Program dodaje do listy elementy a, b, c i d, a nastepnie sprawdza, czy w tych strukturach w polu pole1 nie ma przypadkiem 6.
I chodzi o te instrukcje w komentarzu - cały czas Dev wyrzuca mi błedy.
Szukałem, ale nie potrafiłem znaleśc.
Czy wie ktoś, jak powinna wyglądac poprawnie funkcja cmp i jak powinno wyglądac wywołanie binary_search ?
Użytkownik Vab_Naren edytował ten post 13 sierpień 2006, 19:42
Po pierwsze:
binary_search masz źle wywołane ponieważ 6 którego szukasz nie jest strukturą xxx tylko 6-stką :) (niezgadzają się typy). Musisz dodać nowy egzemplarz struktury z szukanym elementem.
Po drugie:
binary_search działa tylko wtedy kiedy elementy są posortowane, Dodajesz funkcję porównującą pole1, ale i tak binary_search zwróci false bo zobaczy 1, 3, 100, 6.
Reasumując:#include <iostream> #include <algorithm> #include <list> using namespace std; struct xxx { int pole1; int pole2; }; bool cmp(xxx obj1, xxx obj2) { return (obj1.pole1 < obj2.pole1); } int main() { list<xxx> lista; xxx a, b, c, d; a.pole1 = 1; a.pole2 = -1; b.pole1 = 3; b.pole2 = -3; c.pole1 = 6; c.pole2 = -6; d.pole1 = 100; d.pole2 = -100; lista.push_back(a); lista.push_back(b ); lista.push_back( c ); lista.push_back(d); xxx szukane; szukane.pole1 = 6; szukane.pole2 = 3; //drugie pole nie jest ważne if(binary_search(lista.begin(), lista.end(), szukane, cmp)) cout << "Jest"; std::cin.get(); return 0; }
Użytkownik reVis edytował ten post 13 sierpień 2006, 20:16
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
#include <algorithm>
bool binary_search( iterator start, iterator end, const TYPE& val );
bool binary_search( iterator start, iterator end, const TYPE& val, Comp f );
Pierwszą definicję rozumiem, ale z druga mam problem. Ostatni parametr to wskaźnik do funkcji porównującej elementy kontenera. Napisałem taki oto kod, w którym chciałem pobawic się binary_search
#include <iostream> #include <algorithm> #include <list> using namespace std; struct xxx { int pole1; int pole2; }; bool cmp(xxx obj1, xxx obj2) { return (obj1.pole1 < obj2.pole1); } int main() { list<xxx> lista; xxx a, b, c, d; a.pole1 = 1; a.pole2 = -1; b.pole1 = 3; b.pole2 = -3; c.pole1 = 100; c.pole2 = -100; d.pole1 = 6; d.pole2 = -6; lista.push_back(a); lista.push_back(b); lista.push_back(c); lista.push_back(d); //if(binary_search(lista.begin(), lista.end(), 6, cmp)) cout << "Jest"; }
Program dodaje do listy elementy a, b, c i d, a nastepnie sprawdza, czy w tych strukturach w polu pole1 nie ma przypadkiem 6.
I chodzi o te instrukcje w komentarzu - cały czas Dev wyrzuca mi błedy.
Szukałem, ale nie potrafiłem znaleśc.
Czy wie ktoś, jak powinna wyglądac poprawnie funkcja cmp i jak powinno wyglądac wywołanie binary_search ?
Użytkownik Vab_Naren edytował ten post 13 sierpień 2006, 19:42
Po pierwsze:
binary_search masz źle wywołane ponieważ 6 którego szukasz nie jest strukturą xxx tylko 6-stką :) (niezgadzają się typy). Musisz dodać nowy egzemplarz struktury z szukanym elementem.
Po drugie:
binary_search działa tylko wtedy kiedy elementy są posortowane, Dodajesz funkcję porównującą pole1, ale i tak binary_search zwróci false bo zobaczy 1, 3, 100, 6.
Reasumując:#include <iostream> #include <algorithm> #include <list> using namespace std; struct xxx { int pole1; int pole2; }; bool cmp(xxx obj1, xxx obj2) { return (obj1.pole1 < obj2.pole1); } int main() { list<xxx> lista; xxx a, b, c, d; a.pole1 = 1; a.pole2 = -1; b.pole1 = 3; b.pole2 = -3; c.pole1 = 6; c.pole2 = -6; d.pole1 = 100; d.pole2 = -100; lista.push_back(a); lista.push_back(b ); lista.push_back( c ); lista.push_back(d); xxx szukane; szukane.pole1 = 6; szukane.pole2 = 3; //drugie pole nie jest ważne if(binary_search(lista.begin(), lista.end(), szukane, cmp)) cout << "Jest"; std::cin.get(); return 0; }
Użytkownik reVis edytował ten post 13 sierpień 2006, 20:16