Listen sortieren klappt nicht!?



  • Hallo,

    ich habe schon die Suchfunktion bemüht, aber nicht genau eine Antwort auf mein Problem gefunden...

    (Plattform: MS Developer Studio SP6)

    Und daher hier mein Code-Beispiel:

    Eine Liste mit den Elementen CPfad soll sortiert (nach ihrem Gewicht) werden:

    class CPfad
    {
    private:
       double gew;
       vector<CZweig*> zweigpfad;
       CKnoten *anf_knot;
       CKnoten *end_knot;
    public:
    
       CPfad();
       CPfad(const double g);
       ~CPfad();
    
       CKnoten* gib_anf_knot() const { return anf_knot; };
       void setze_anf_knot(CKnoten* const k) { anf_knot = k; };
    
       CKnoten* gib_end_knot() const { return end_knot; };
       void setze_end_knot(CKnoten* const k) { end_knot = k; };
    
       double gib_gewicht() const { return gew; };
       void setze_gewicht(const double g) { gew = g; };
    
       vector<CZweig*> gib_pfad() const { return zweigpfad; };
    
       bool operator< (const CPfad& x) const
       { return gew < x.gib_gewicht(); }
    
       bool operator> (const CPfad& x) const
       { return gew > x.gib_gewicht(); }
    };
    

    Als einfachen Test Beispiel habe ich folgendes implementiert:

    //Test Sortieren
       (*log) << "TEST SORTIEREN" << endl;
       list<CPfad*> liste;
       liste.push_back(new CPfad(2));
       liste.push_back(new CPfad(12));
       liste.push_back(new CPfad(25));
       liste.push_back(new CPfad(5));
       liste.push_back(new CPfad(38));
    
       //unsortiert
       (*log) << "unsortierte Liste" << endl;
       for(list<CPfad*>::const_iterator pit = liste.begin(); pit != liste.end(); pit++)
       {
          (*log) << (*pit)->gib_gewicht() << endl; 
       }
    
       liste.sort();
    
       //sortiert
       (*log) << "sortierte Liste" << endl;
       for(pit = liste.begin(); pit != liste.end(); pit++)
       {
          (*log) << (*pit)->gib_gewicht() << endl; 
       }
    

    Das erzeugt folgende Ausgabe:

    TEST SORTIEREN
    unsortierte Liste
    2
    12
    25
    5
    38
    sortierte Liste
    25
    12
    2
    5
    38

    Was ist denn da schiefgegangen???

    Danke.



  • Du sortierst eine Liste mit Zeigern auf Pfadobjekte, es werden also die Zeiger sortiert! Du musst ein zusätzliches Argument beim sortieren angeben, hab jetzt leider keine Zeit, aber schau dir mal den dritten Paramter an!



  • Danke, das stimmt natürlich.

    Habe mir folgendermaßen geholfen:

    #include <iostream.h>
    #include <list>
    #include <functional>
    
    using namespace std;
    
    class test
    {
    public:
       int x;
       test();
       test(const int & ax):x(ax){};
    };
    
    struct testsort : public greater<test*>
    {
       bool operator()(const test* t1, const test* t2)
          return t1->x > t2->x;
    };
    
    int main(int argc, char* argv[])
    {
    
       list<test*> testliste;
    
       test* a = new test(7);
       test* b = new test(5);
       test* c = new test(10);
       test* d = new test(8);
    
       testliste.push_back(a);
       testliste.push_back(b);
       testliste.push_back(c);
       testliste.push_back(d);
    
       testliste.sort(testsort());
    
       for(list<test*>::const_iterator ti = testliste.begin(); ti!=testliste.end(); ti++)
       {
          cout << (*ti)->x << endl;
       }
    
    	return 0;
    }
    

    Leider musste ich feststellen, dass das ganze unter Linux funktioniert, mit MS VC 6 allerdings nicht 😡 !
    Erst mit dem .NET-Studio soll es dann klappen.



  • Was genau geht denn da unter MSVC6 nicht? Vielleicht kann man was basteln. Zur Not halt nen Funktionspointer übergeben.



  • Member Template Funktionen sind das Problem. Hier der Auszug aus dem MSDN:

    list::sort

    void sort();
    template<class Pred>
        void sort(greater<T> pr);
    

    Both member functions order the elements in the controlled sequence by a predicate, described below.

    For the iterators Pi and Pj designating elements at positions i and j, the first member function imposes the order !(*Pj < *Pi) whenever i < j. (The elements are sorted in ascending order.) The member template function imposes the order !pr(*Pj, *Pi) whenever i < j. No pairs of elements in the original controlled sequence are reversed in the resulting controlled sequence.

    In this implementation, if a translator does not support member template functions, the template:

    template<class Pred>
        void sort(Pred pr);
    is replaced by:
    
    void sort(greater<T> pr);
    

Anmelden zum Antworten