Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » stl algorithmus sort

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.10.2004, 09:51 Uhr
~stud
Gast


Tach zusammen,

ich habe in etwa folgendes konstrukt:

list<process*> prozessliste;


process ist eine von mir geschriebe Klasse.
in dieser klasse habe ich den operator<(..) überschrieben, so dass 2 prozesse vergleichbar werden. jetzt würde ich gerne die prozesse sortieren mit dem algorithmus sort der STL. leider funktionert das nicht direkt, da ein iterator auf list<process*> ja 2 mal dereferenziert werden muss, so dass man tatsächlich einen process hat.

bei sort kann man eine vergleichsfunktion angeben, wenn nicht das standard < verwendet werden soll, aber wie geht das?

Ansonsten, wie würdet ihr das Problem lösen?

Danke und bis dann!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.10.2004, 11:01 Uhr
virtual
Sexiest Bit alive
(Operator)



C++:
struct processptr_cmp
{
    inline bool operator () (const process* p1, const process* p2) { return (*p1) < (*p2); }
};
...
processliste.sort(processptr_cmp());


oder - generischer:

C++:
template<class T>
struct dereference_comparator {
    inline bool operator () (const T* p1, const T* p2) { return (*p1) < (*p2); }
};

...
processliste.sort(dereference_comparator<process>());


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.10.2004, 11:15 Uhr
0xdeadbeef
Gott
(Operator)


Mit list ist es ein bisschen komplizierter, weil p - q für zwei std::list<t>::iterator p,q nicht funktioniert. Allerdings liefert list dafür ne eigene Methode mit. Ds sieht dann im Endeffekt so aus:

C++:
#include <iostream>
#include <list>

bool compare_intp(int *p, int *q) { return *p < *q; } // <-- Vergleichsfunktion

int main() {
  int a = 5, b = 23, c = 17, d = 12, e = 0;

  std::list<int*> l;

  l.push_back(&a);
  l.push_back(&b);
  l.push_back(&c);
  l.push_back(&d);
  l.push_back(&e);

  l.sort(&compare_intp); // <--- hier sortieren

  for(std::list<int*>::iterator i = l.begin(); i != l.end(); ++i)
    std::cout << **i << " ";
  std::cout << std::endl;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.10.2004, 17:49 Uhr
~stud
Gast


vielen dank, funktioniert!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.10.2004, 18:19 Uhr
0xdeadbeef
Gott
(Operator)


BTW, virtual, wenn schon generisch, dann bitte auch richtig:

C++:
template<typename t, typename compare_t = std::less<t> >
class dereference_comparator {
protected:
  compare_t comp;
public:
  template<typename ptr_t>
  inline bool operator () (ptr_t const &p1, ptr_t const &p2) const {
    return comp(*p1, *p2);
  }
};


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
28.10.2004, 19:57 Uhr
virtual
Sexiest Bit alive
(Operator)


asche auf mein haupt
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
29.10.2004, 07:12 Uhr
(un)wissender
Niveauwart


Eben, da fehlen überall die const- Qualifier bei dem operator(), beefy und virtual.
Jetzt kommt mir nicht mit, ist egal, da keine Attribute,).
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
29.10.2004, 10:03 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von (un)wissender:
Eben, da fehlen überall die const- Qualifier bei dem operator(), beefy und virtual.
Jetzt kommt mir nicht mit, ist egal, da keine Attribute,).

Oh, ich dacht es ist klar, daß dei dem geneigten Leser das Einfügen der const Qualifier zur Übung überlassen bleibt.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
29.10.2004, 10:34 Uhr
(un)wissender
Niveauwart


@beefy
Sorry, bei dir ist er ja da!

@virtual
Hm, vielleicht sollte Windalf zur Strafe seines ignorierens von const das ganze Forum nach fehlendem const durchsuchen. Daran dachtest du doch sicherlich, oder?
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 29.10.2004 um 10:34 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: