<algorithm> sort, problem
-
hi,
ich weiß nicht so genau was der compiler von mir will wenn ich die sort funktion benutzen will
mein code sieht so aus:
int main() { char menue='0'; Fahrzeuge *car = NULL; // Klasse Fahrzeuge Arbeit_Mat *workmat = NULL; // Klasse Arbeit_Mat list<Fahrzeuge> kfz; list<Arbeit_Mat> arbmat; //Menü.. car_add(menue,car,&kfz);void car_add(char menue, Fahrzeuge *car, list<Fahrzeuge> *kfz) { car = new Fahrzeuge; //zuweisungen kfz->push_back(*car); sort( kfz->begin(), kfz->end() ); delete car; }naja und dann kommt ne ganze latte an fehlermeldungen, die wohl alle an dieser sortfunktion hängen, wenn ich diese auskommentiere läufts einwandfrei..
c:\programme\microsoft visual studio 8\vc\include\algorithm(2754) : error C2784: "reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)": template-Argument für "const std::reverse_iterator<_RanIt> &" konnte nicht von "std::list<_Ty>::_Iterator<_Secure_validation>" hergeleitet werden. with [ _Ty=Fahrzeuge, _Secure_validation=true ] c:\programme\microsoft visual studio 8\vc\include\xutility(1818): Siehe Deklaration von 'std::operator -' i:\#proggen-fh\_studium fh-worms\_grundstudium\programmieren 2\praktikum\ss2006_aufgabe5\kfz-verwaltung\main.cpp(46): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void std::sort<std::list<_Ty>::_Iterator<_Secure_validation>>(_RanIt,_RanIt)". with [ _Ty=Fahrzeuge, _Secure_validation=true, _RanIt=std::list<Fahrzeuge>::_Iterator<true> ] c:\programme\microsoft visual studio 8\vc\include\algorithm(2754) : error C2784: "reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)": template-Argument für "const std::reverse_iterator<_RanIt> &" konnte nicht von "std::list<_Ty>::_Iterator<_Secure_validation>" hergeleitet werden. with [ _Ty=Fahrzeuge, _Secure_validation=true ] c:\programme\microsoft visual studio 8\vc\include\xutility(1818): Siehe Deklaration von 'std::operator -' c:\programme\microsoft visual studio 8\vc\include\algorithm(2754) : error C2784: "reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)": template-Argument für "const std::reverse_iterator<_RanIt> &" konnte nicht von "std::list<_Ty>::_Iterator<_Secure_validation>" hergeleitet werden. with [ _Ty=Fahrzeuge, _Secure_validation=true ] c:\programme\microsoft visual studio 8\vc\include\xutility(1818): Siehe Deklaration von 'std::operator -' c:\programme\microsoft visual studio 8\vc\include\algorithm(2754) : error C2784: "reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)": template-Argument für "const std::reverse_iterator<_RanIt> &" konnte nicht von "std::list<_Ty>::_Iterator<_Secure_validation>" hergeleitet werden. with [ _Ty=Fahrzeuge, _Secure_validation=true ] c:\programme\microsoft visual studio 8\vc\include\xutility(1818): Siehe Deklaration von 'std::operator -' c:\programme\microsoft visual studio 8\vc\include\algorithm(2754) : error C2676: Binärer Operator '-': 'std::list<_Ty>::_Iterator<_Secure_validation>' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht with [ _Ty=Fahrzeuge, _Secure_validation=true ] c:\programme\microsoft visual studio 8\vc\include\algorithm(2754) : error C2780: 'void std::_Sort(_RanIt,_RanIt,_Diff,_Pr)': Erwartet 4 Argumente - 3 unterstützt c:\programme\microsoft visual studio 8\vc\include\algorithm(2873): Siehe Deklaration von 'std::_Sort'wisst ihr was ich falsch gemacht habe?
Danke und Gruß
-
der sort-algorithmus benötigt random-access iteratoren, kann folglich nicht mit list verwendet werden. allerdings verfügt list über eine sort memberfunktion.
-
hi,
ok soweit so gut aber irgendwie will es mit dieser memberfunktion auch nicht...
void car_add(char menue, Fahrzeuge *car, list<Fahrzeuge> *kfz) { car = new Fahrzeuge; //zuweisungen kfz->push_back(*car); //sort( kfz->begin(), kfz->end() ); kfz->sort(); delete car; }c:\programme\microsoft visual studio 8\vc\include\xutility(276) : error C2784: "bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)": template-Argument für "const std::basic_string<_Elem,_Traits,_Alloc> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\string(151): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\list(957): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "bool std::_Debug_lt<Fahrzeuge,Fahrzeuge>(_Ty1 &,_Ty2 &,const wchar_t *,unsigned int)". with [ _Ty1=Fahrzeuge, _Ty2=Fahrzeuge ] c:\programme\microsoft visual studio 8\vc\include\list(948): Bei der Kompilierung der Klassen-template der void std::list<_Ty>::merge(std::list<_Ty> &)-Memberfunktion with [ _Ty=Fahrzeuge ] i:\#proggen-fh\_studium fh-worms\_grundstudium\programmieren 2\praktikum\ss2006_aufgabe5\kfz-verwaltung\main.cpp(45): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::list<_Ty>". with [ _Ty=Fahrzeuge ] c:\programme\microsoft visual studio 8\vc\include\xutility(276) : error C2784: "bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "const _Elem *" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\string(141): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(276) : error C2784: "bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "const std::basic_string<_Elem,_Traits,_Alloc> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\string(131): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(276) : error C2784: "bool std::operator <(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)": template-Argument für "const std::list<_Ty,_Ax> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\list(1274): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(276) : error C2784: "bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)": template-Argument für "const std::reverse_iterator<_RanIt> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\xutility(1842): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(276) : error C2784: "bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)": template-Argument für "const std::pair<_Ty1,_Ty2> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\utility(76): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(276) : error C2676: Binärer Operator '<': 'Fahrzeuge' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht c:\programme\microsoft visual studio 8\vc\include\xutility(278) : error C2784: "bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)": template-Argument für "const std::basic_string<_Elem,_Traits,_Alloc> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\string(151): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(278) : error C2784: "bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "const _Elem *" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\string(141): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(278) : error C2784: "bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "const std::basic_string<_Elem,_Traits,_Alloc> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\string(131): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(278) : error C2784: "bool std::operator <(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)": template-Argument für "const std::list<_Ty,_Ax> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\list(1274): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(278) : error C2784: "bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)": template-Argument für "const std::reverse_iterator<_RanIt> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\xutility(1842): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(278) : error C2784: "bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)": template-Argument für "const std::pair<_Ty1,_Ty2> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\utility(76): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(278) : error C2676: Binärer Operator '<': 'Fahrzeuge' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht KFZ-Verwaltung - 14 Fehler, 0 Warnung(en)
-
Deine Klasse Fahrzeug braucht einen operator<
BTW, warum allokierst und löscht Du sinnlos Speicher, nur um eine Kopie davon in die Liste zu packen?
kfz->push_back(car( ));
-
Du brauchst einen Vergleichsoperator (operator<) für Fahrzeuge, um sortieren zu können. Andernfalls weiß sort() nicht, in welcher Reihenfolge es die Elemente anordnen soll.
Übrigens macht es deine Parameterübergabe wenig Sinn. Entweder du legst dein 'car' in der Funktion an, dann brauchst du dafür keinen Pointer-Parameter (nimm lieber eine lokale Variable) oder du übergibst ein fertig initialisiertes Objekt:
//Variante 1: void add_car(list<Fahrzeuge>&kfz,const string& modell,int ps/*,...*/) { Fahrzeuge car; //car initialisieren kfz.push_back(car); ... } add_car(kfz_list,"VW Golf",100/*,...*/); //Variante 2: void add_car(list<Fahrzeuge>&kfz,const Fahrzeuge& car) { kfz.push_back(car); ... } Fahrzeuge auto; //auto initialisieren add_car(kfz_list,auto);
-
hmm
ich hab mir das so gedacht, ich leg ein objekt zu der klasse an, lese die werte ein, lege es in der liste ab und lösche das objekt wieder...
sry programmiere noch nicht lange c++ ( klassen etc.. ).werde später versuchen deine methode umzusetzen cstoll. danke schön!
-
Da_Pedro schrieb:
ich hab mir das so gedacht, ich leg ein objekt zu der klasse an, lese die werte ein, lege es in der liste ab und lösche das objekt wieder...
Gute Idee, nur ist es Overkill, dafür die Heap-Verwaltung anzuwerfen
Stack-Objekte (=lokale Variablen) sind um einiges schneller.
-
CStoll schrieb:
Stack-Objekte (=lokale Variablen) sind um einiges schneller.
*Hmmm* *grümel*
Man kann Objekte doch auf dem Stack schneller anlegen und entfernen als aufm Heap, oder ? Das meint dein "schneller" auch .. ?Aber der Zugriff auf Objekte auf dem Stack/Heap ist doch gleich schnell ... ??
-
Freak_Coder schrieb:
CStoll schrieb:
Stack-Objekte (=lokale Variablen) sind um einiges schneller.
*Hmmm* *grümel*
Man kann Objekte doch auf dem Stack schneller anlegen und entfernen als aufm Heap, oder ? Das meint dein "schneller" auch .. ?Aber der Zugriff auf Objekte auf dem Stack/Heap ist doch gleich schnell ... ??
der zugriff ja, aber die reservierung des speichers (und die spätere freigabe) ist auf dem stack praktisch völlig ohne zeitkosten, beim freestore sieht das anders aus. in diesem einfachen fall würde ich auf eine lokale variable ganz verzichten und gleich nur ein temporäres objekt anlegen. also
kfz->push_back(Fahrzeuge());
-
du sagst ich brauche einen vergleichsoperator < aber wo ist der in deinem bsp? muss ich dafür eine const variable anlegen um diese vergleichen zu können?
ich poste mal wie meine funktion aussieht, sortiert werden soll nach nummernschild..:
void car_add(char menue, list<Fahrzeuge> *kfz) { string nrschild, hersteller, modell, km, kraftstoff; Fahrzeuge car; cout << "Bitte Fahrzeugdaten eingeben" << endl << endl; cout << "Nummernschild: "; getline(cin,nrschild); cout << "Hersteller: "; getline(cin,hersteller); cout << "Modell: "; getline(cin,modell); cout << "Kilometer: " ; getline(cin,km); cout << "Kraftstoff: "; getline(cin,kraftstoff); car.set_nrschild(nrschild); car.set_hersteller(hersteller); car.set_modell(modell); car.set_km(km); car.set_kraftstoff(kraftstoff); kfz->push_back(car); //sort( kfz->begin(), kfz->end() ); kfz->sort(); system("cls"); }meine klasse sieht so aus:
.hclass Fahrzeuge { public: Fahrzeuge(); ~Fahrzeuge(void); void set_nrschild(string); string get_nrschild(); //... protected: string nrschild,//...restliche var.cpp
void Fahrzeuge::set_nrschild(string dummy_nrschild) { nrschild = dummy_nrschild; } string Fahrzeuge::get_nrschild() { return nrschild; }
-
Deine Klasse Fahrzeuge braucht einen Vergleichsoperator, wie soll sie sonst sortiert werden.
Global sieht das etwa so ausbool operator<( const Fahrzeuge& lhs, const Fahrzeuge& rhs) { // nun der Code für den Vergleich }
-
aso ich muss den operator für meine bedürfnisse überladen... jetzt klingelts. vielen dank