kontener <set> a przeciazanie operatorow

Odpowiedz Nowy wątek
klarkid
2011-03-05 22:29
klarkid
0

Czesc,

w jaki sposob nalezy przeciazyc operatory, aby korzystajac z klasy

class zadanie {
public:
int r, p, q, m;

int daj_r() const { return r; }
int daj_p() const { return p; }
int daj_q() const { return q; }
int daj_m() const { return m; }
};

w kontenerze <set>

set<zadanie> G;
set<zadanie> N;

obiekt G byl sortowany po q, a obiekt N po r?
Czy jest to w ogole mozliwe?

Dzieki za wszelka pomoc

Pozostało 580 znaków

2011-03-05 22:37
Moderator

Rejestracja: 16 lat temu

Ostatnio: 4 minuty temu

0

Stwórz sobie funkcje/funktory porównujace obiekty typu zadanie po polu które cie interesuje a potem do sorta przekazuj tą funkcję/funktor.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

klarkid
2011-03-05 23:11
klarkid
0

znalazlem cos takiego:

class zadanie {
public:
int r, p, q, m;

bool cmpu_r(zadanie* i,zadanie* j) { return i?(j?(i->r<j->r):false):(bool)j; }
bool cmpd_r(zadanie* i,zadanie* j) { return j?(i?(i->r>j->r):false):(bool)i; }
bool cmpu_q(zadanie* i,zadanie* j) { return i?(j?(i->q<j->q):false):(bool)j; }
bool cmpd_q(zadanie* i,zadanie* j) { return j?(i?(i->q>j->q):false):(bool)i; }
};

ale pojecia nie mam jak te funkcje mozna wykorzystac np w probie dodania elementu do N:


zadanie tab [10000];
set<zadanie> G;
set<zadanie> N;

for (i=1; i<n+1; i++) {
    N.insert(tab[i]); //???
    }

Pozostało 580 znaków

13ty Smok
2011-03-05 23:42
13ty Smok
0
struct zadanie
  {
   int r, p, q, m;
  };
struct zq
  {
   bool operator() (const zadanie &lhs, const zadanie &rhs) const { return lhs.q<rhs.q; }
  };
struct zr
  {
   bool operator() (const zadanie &lhs, const zadanie &rhs) const { return lhs.r<rhs.r; }
  };

set<zadanie,zq> G;
set<zadanie,zr> N;

Pozostało 580 znaków

klarkid
2011-03-06 01:18
klarkid
0

merci :)

a jak przeciazyc operator ==, tak aby porownywal int'a ze skladowa m

for( it=N.begin(); it!=N.end(); ++it) {
     if (*it == 6)
     N.erase(it++);
     else
     ++it;
     }

probowalem ta droga na rozne sposoby ale nie przeszlo :/

class zadanie {
public:
   int r, p, q, m;
   friend ostream& operator << (ostream &wyjscie, const zadanie &s) {
          return wyjscie << "r: " << s.r << endl << "p: " <<s.p<<endl << "q: " <<s.q<<endl << "m: " <<s.m<<endl;
   } 
   bool operator == (const zadanie &s) { return s.m == ??? }
  };
operator w tym przypadku to też metoda, czyli masz dostęp do this. - Xupicor 2011-03-06 01:44

Pozostało 580 znaków

2011-03-06 21:33

Rejestracja: 16 lat temu

Ostatnio: 4 godziny temu

1
bool cmpu_r(zadanie* i,zadanie* j) { return i?(j?(i->r<j->r):false):(bool)j; }

To z konkursu na obfuscated C++?

edytowany 1x, ostatnio: Azarien, 2011-03-06 21:33

Pozostało 580 znaków

2011-03-07 12:09

Rejestracja: 12 lat temu

Ostatnio: 2 godziny temu

0

Nie modyfikując pierwotnej klasy:

class LessZadanie : public binary_function<const zadanie &, const zadanie &, bool>  
{
    int (zadanie::*klucz)() const;
public:
    LessZadanie (int (zadanie::*klucz)() const) : klucz(klucz) {}
    bool operator(const zadanie &a, const zadanie &b) const {
        return (a.*klucz)()<(a.*klucz)();
    }
};

set<zadanie, LessZadanie> G(LessZadanie(&zadanie::daj_q));
set<zadanie, LessZadanie> N(LessZadanie(&zadanie::daj_n));

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 3x, ostatnio: MarekR22, 2011-03-07 13:05

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0