ďťż

Ładny brzuch

Cześć. Z góry informuję, że jestem cienki w C++ :)

Otóż mam sobie strukturę o nazwie `wynik`:
struct wynik { int wynik1; int wynik2; };
I mam vector, w którym jest sporo tych struktur (0 < sporo < 1 000 000). Chciałbym zrobić za pomocą max_element() z <algorithm> pobrać elementy z największym polem wynik2. Oczywiste jednak jest, że jeżeli podam w postaci max_element(wyniki.begin(), wyniki.end()); to nie zadziała, bo w sumie jak kompilator ma stwierdzić, czy jedna struktura jest większa od drugiej? :) Chciałem więc, żeby sprawdzał tylko, czy pole wynik2 jest maksymalne, jeżeli tak to zwracał. W przypadku sortowania vectora z takimi danymi poradziłem sobie w prosty sposób:
bool cmp( wynik a, wynik b ) { // do sortowania return a.wynik2 > b.wynik2; } sort(wyniki.begin(), wyniki.end(), cmp);
Nie działa to jednak przy max_element(). Pytanie, jak to zrobić?
Użytkownik dodek edytował ten post 05 marzec 2007, 17:53


#include <iostream> #include <algorithm> #include <vector> using namespace std; struct wynik { int wynik1; int wynik2; }; bool cmp( wynik a, wynik b ) { // do sortowania return a.wynik2 < b.wynik2; }; int main() { wynik wyniki[] = { {1,5}, {1,1}, {1,3} }; std::vector<wynik> w; w.push_back(wyniki[0]); w.push_back(wyniki[1]); w.push_back(wyniki[2]); cout << (*max_element(w.begin(), w.end(), cmp )).wynik2 << endl; return 0; }

struct element{ int v1, v2; }; bool cmp( element& e1, element& e2 ){ return e1.v2 < e2.v2; } int main(int argc, char *argv[]) { vector< element > v; element temp; temp.v1 = 2; temp.v2 = 4; v.push_back(temp); temp.v1 = 10; temp.v2 = 1; v.push_back(temp); element max = *max_element(v.begin(), v.end(), cmp); cout << max.v1 << endl << max.v2; system("PAUSE"); return EXIT_SUCCESS; }

//sorki icek mnie uprzedzil, jak by co to skasujcie
Użytkownik Artur Menc edytował ten post 05 marzec 2007, 18:25
Hm, nie wiedziałem, że to takie proste. A w przypadku gdy jest kilka największych elementów dałoby się dostać je w postaci vectora?



imo sam max_element tego nie zrobi (jak nazwa wskazuje, element - w liczbe poj. ;-) ) ale mozesz zrobic taki trik , ze przerzucasz do 2 wektora, wszystkie najwieksze, rowne sobie:

#include <iostream> #include <algorithm> #include <vector> using namespace std; struct wynik { int wynik1; int wynik2; }; bool cmp( wynik a, wynik b ) { // do sortowania return a.wynik2 < b.wynik2; }; int main() { wynik wyniki[] = { {1,5}, {1,1}, {1,5} }; std::vector<wynik> w; std::vector<wynik> max; std::vector<wynik>::iterator M; w.push_back(wyniki[0]); w.push_back(wyniki[1]); w.push_back(wyniki[2]); // szukasz max int max_int = (*max_element(w.begin(), w.end(), cmp )).wynik2; // dopoki sa rowne, to przezucasz je do innego vectora. while( (*(M = max_element(w.begin(), w.end(), cmp ))).wynik2 == max_int ) { max.push_back( *M ); w.erase(M); } for( unsigned i = 0; i < max.size(); i ++ ) { cout << max[i].wynik2 << endl; } return 0; }

mam nadzieje ze ten kod dziala poprawnie bo testowalem tylko na tym przykladzie ;D

EDIT: szybciej bylo by chyba nawet wyszukiwac po prostu takie same a nie za kazdym razem szukac max. Bylo by szybciej, ale nie chce mi sie juz tego pisac,
poradzisz sobie ;-).

EDIT2: a masz, sama zawartosc main() :
wynik wyniki[] = { {1,5}, {1,1}, {1,5} }; std::vector<wynik> w; std::vector<wynik> max; w.push_back(wyniki[0]); w.push_back(wyniki[1]); w.push_back(wyniki[2]); // szukasz max int max_int = (*max_element(w.begin(), w.end(), cmp )).wynik2; for( unsigned i = 0; i < w.size(); i ++ ) if( w[i].wynik2 == max_int ) max.push_back( w[i] ); for( unsigned i = 0; i < max.size(); i ++ ) { cout << max[i].wynik2 << endl; }
Użytkownik icek edytował ten post 05 marzec 2007, 18:52
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •