sort vector - mit eigenen Objekten



  • Hallo zusammen,

    Wieso leitet man von binary_function ab?
    Was bringt einem das?
    Es functioniert doch auch ohne...
    Oder wird das dann implizit gemacht?

    Warum hat man beim Design der STL eigentlich keinen Funktionszeiger als
    Parameter festgelegt? Was für einen Nachteil hätte das? Fänd ich ehrlich gesagt
    sinnvoller.

    Gruß,
    binary_function



  • @One: Du übergibst einen vector<CMusikstueck*****> an die sort-Funktion, also sollte dein Comparator auch mit CMusikstueck-Pointern hantieren können.

    @binary_function:

    binary_function schrieb:

    Wieso leitet man von binary_function ab?
    Was bringt einem das?
    Es functioniert doch auch ohne...
    Oder wird das dann implizit gemacht?

    binary_function<> enthält im Prinzip nur drei typedefs für die Parameter- und Rückgabetypen des Funktors. Nötig ist es nicht, das zu verwenden, aber wenn jemand diese typedefs benötigt (z.B. um den Funktor mit anderen zusammenzufügen), spart das einiges an Schreibarbeit 😉

    Warum hat man beim Design der STL eigentlich keinen Funktionszeiger als
    Parameter festgelegt? Was für einen Nachteil hätte das? Fänd ich ehrlich gesagt
    sinnvoller.

    Die STL arbeitet mit Templates, weil das mächtiger ist. Und sort() schluckt als Comparator alles, was wie eine 2-Parameter-Funktion aufgerufen werden kann (solange du den Werttyp der übergebenen Iteratoren implizit in die Parametertypen konvertieren kannst) - also auch "normale" Funktionszeiger. Aber Funktoren sind häufig mächtiger und flexibler.



  • Also namespace und import müsste passen hab oben:

    #include <algorithm>
    #include <string>
    #include <iostream>
    #include <vector>
    #include <fstream>
    #include <iomanip>
    
    #include "IBaseFunction.h"
    #include "CMusikstueck.h"
    
    using namespace std;
    

    CStoll schrieb:

    @One: Du übergibst einen vector<CMusikstueck*****> an die sort-Funktion, also sollte dein Comparator auch mit CMusikstueck-Pointern hantieren können.

    Hab das jetzt geändert!

    void CMusikDBase::sort(sort_type sortMode,    vector<CMusikstueck*>& findVector, vector<CMusikstueck*>& sortVector){
    
    struct MyComparator : public binary_function<CMusikstueck*,CMusikstueck*,bool>
    {
    		  MyComparator(sort_type t) : typ(t) {}
    		  bool operator()( CMusikstueck* l, CMusikstueck* r)
    		  {
    		    switch(typ){ 
    			   case TYPE_SORT:
    					return l->getType() < r->getType();
    			   case TITEL_SORT:
    			        return l->getTitel() < r->getTitel();
    			   case INTPR_SORT:
    					return l->getInterpret() <  r->getInterpret();			     			   
    			   default:
    					return true;
    			};		   
    		  }
    private:
    		  sort_type typ;
    };
    
    	sort(findVector.begin(), findVector.end(),MyComparator(sortMode));
    }
    

    Fehlermeldung ist aber noch immer da!

    CMusikDBase.cpp: In member function âvoid CMusikDBase::sort(sort_type, std::vector<CMusikstueck*, std::allocator<CMusikstueck*> >&, std::vector<CMusikstueck*, std::allocator<CMusikstueck*> >&)â:
    CMusikDBase.cpp:299: error: no matching function for call to âCMusikDBase::sort(__gnu_cxx::__normal_iterator<CMusikstueck**, std::vector<CMusikstueck*, std::allocator<CMusikstueck*> > >, __gnu_cxx::__normal_iterator<CMusikstueck**, std::vector<CMusikstueck*, std::allocator<CMusikstueck*> > >, CMusikDBase::sort(sort_type, std::vector<CMusikstueck*, std::allocator<CMusikstueck*> >&, std::vector<CMusikstueck*, std::allocator<CMusikstueck*> >&)::MyComparator)â
    CMusikDBase.cpp:277: note: candidates are: void CMusikDBase::sort(sort_type, std::vector<CMusikstueck*, std::allocator<CMusikstueck*> >&, std::vector<CMusikstueck*, std::allocator<CMusikstueck*> >&)
    

    Das ist exakt die selbe wie oben
    MFG THE_ONE



  • Dann solltest du auch noch freak_coder's Bemerkung berücksichtigen - die Methode CMusikDBase::sort() verdeckt den STL-Algorithmus std::sort(), also mußt du dem Compiler schon dazusagen, daß du nicht rekursiv dich selber aufrufen willst.



  • CStoll schrieb:

    Dann solltest du auch noch freak_coder's Bemerkung berücksichtigen - die Methode CMusikDBase::sort() verdeckt den STL-Algorithmus std::sort(), also mußt du dem Compiler schon dazusagen, daß du nicht rekursiv dich selber aufrufen willst.

    Hi Danke 👍 , das habe ich voll übersehen 😡, hab das ganze umbenannt:
    Fehler ist leider noch da, und die Fehlermeldung ist die gleiche:

    CMusikDBase.cpp: In member function âvoid CMusikDBase::vsort(sort_type, std::vector<CMusikstueck*, std::allocator<CMusikstueck*> >&, std::vector<CMusikstueck*, std::allocator<CMusikstueck*> >&)â:
    CMusikDBase.cpp:299: error: no matching function for call to âsort(__gnu_cxx::__normal_iterator<CMusikstueck**, std::vector<CMusikstueck*, std::allocator<CMusikstueck*> > >, __gnu_cxx::__normal_iterator<CMusikstueck**, std::vector<CMusikstueck*, std::allocator<CMusikstueck*> > >, CMusikDBase::vsort(sort_type, std::vector<CMusikstueck*, std::allocator<CMusikstueck*> >&, std::vector<CMusikstueck*, std::allocator<CMusikstueck*> >&)::MyComparator)â
    

    wo liegt eigentlich sort genau? Liegt das in std?



  • *grübelt* Vielleicht stört den Compiler ja, daß du die Comparator-Klasse lokal in der Funktion angelegt hast.

    wo liegt eigentlich sort genau? Liegt das in std?

    Ja, normalerweise schon.



  • CStoll schrieb:

    *grübelt* Vielleicht stört den Compiler ja, daß du die Comparator-Klasse lokal in der Funktion angelegt hast.

    wo liegt eigentlich sort genau? Liegt das in std?

    Ja, normalerweise schon.

    Du bist mein Hero 👍 ! Das wars, es funktioniert! Könntest du mir vielleicht erklären wo ich das am besten hinschreibe. Ich habs jetzt einfach mal vor das sort geschrieben was aber natürlich ned fein aussieht. Was ich mich noch frage: warum schreibt man struct. Normalerweise kann man in einer struct ja gar keine Funktionen deklarieren, oder? Das geht doch nur in Klassen.

    MFG THE_ONE



  • THE_ONE schrieb:

    Könntest du mir vielleicht erklären wo ich das am besten hinschreibe. Ich habs jetzt einfach mal vor das sort geschrieben was aber natürlich ned fein aussieht.

    Am besten aufgehoben dürfte dieser Comparator in der Nähe der Musikstueck-Klasse sein, schließlich dient er ja zur Verarbeitung von Musikstücken.

    Was ich mich noch frage: warum schreibt man struct. Normalerweise kann man in einer struct ja gar keine Funktionen deklarieren, oder? Das geht doch nur in Klassen.

    C++ sieht das nicht ganz so eng wie du 😉 Der einzige Unterschied zwischen 'struct' und 'class' ist der Default-Zugriff auf die Member (bei einer 'class' ist alles private, solange du nichts anderes sagst, bei einer 'struct' public). Abgesehen davon sind beide identisch.



  • CStoll schrieb:

    C++ sieht das nicht ganz so eng wie du 😉 Der einzige Unterschied zwischen 'struct' und 'class' ist der Default-Zugriff auf die Member (bei einer 'class' ist alles private, solange du nichts anderes sagst, bei einer 'struct' public). Abgesehen davon sind beide identisch.

    Wow, hab das jetzt mal getested. Hab statt dem struct class geschrieben und einfach mal ein public davor gesetzt. Und siehe da es funktioniert.

    class MyComparator : public binary_function<CMusikstueck*,CMusikstueck*,bool>
    {		
    public:	
    		MyComparator(sort_type t) : typ(t) {}
    		bool operator()( CMusikstueck* l, CMusikstueck* r)
    		  {
    		    switch(typ){ 
    			   case TYPE_SORT:
    					return l->getType() < r->getType();
    			   case TITEL_SORT:
    			        return l->getTitel() < r->getTitel();
    			   case INTPR_SORT:
    					return l->getInterpret() <  r->getInterpret();			     			   
    			   default:
    					return true;
    			};		   
    		  }
    private:
    		  sort_type typ;
    };
    

    Also du scheinst dich ja ziemlich gut auskennen. Hab gelesen das du Informatik studierst. (ich auch, zu meiner Schande -> Technische Informatik). In meinem Studium ist es leider so, das ich beim gesamten Informatikstudium keinen einzigen OOP Kurs besuchen müsste. Das würde dann bedeuten das ich am ende mit Informatik Diplom abschließe und keinen Strich OOP programmiert habe. Daher besuche ich freiwillig einen OOP Kurs, daher auch meine Problemstellung. Wie lange hast du eigentlich für deine CPP Kenntnisse gebraucht. Würde auch gerne auf so eine Stand kommen 🙂 .

    MFG THE_ONE



  • Soll ich dir was verraten? Die praktischen Erfahrungen habe ich auch eher neben dem Studium gesammelt.

    THE_ONE schrieb:

    Wie lange hast du eigentlich für deine CPP Kenntnisse gebraucht. Würde auch gerne auf so eine Stand kommen 🙂 .

    Schwer zu sagen. Angefangen mit C++ habe ich kurz nach Beginn des Studiums. Aber ich hatte noch einige Vorkenntnisse in Basic (C64 und QBasic) und Turbo Pascal - da war zwar etwas Umstellung nötig, aber es hat gehlfen 😉


Anmelden zum Antworten