vector mit pfeilen nach gewicht sortieren
-
nabend,
ich habe folgendes problem. ich habe einen vector der lauter pfeile eines graphen enthält. jeder pfeil hat den wert gewicht. ich würde nun gern den vector nach den gewichten der pfeile sorten.und dann den vector sortiert zurückgeben. leider schaffe ich das iwie nicht mit der sort-methode und der komparator... hier mal was ich probiert habe mit der fehlermeldung:
bool comparision (pfeil a, pfeil b) { return (a.getGewicht<b.getGewicht); } vector<pfeil> sortVectorPfeil(vector<pfeil> myVector) { sort (myVector.begin(), myVector.end(), comparision); return myVector; }1>d:\....\main.cpp(298) : error C3867: "pfeil::getGewicht": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&pfeil::getGewicht", um einen Zeiger auf den Member zu erstellen. 1>d:\....\main.cpp(298) : error C3867: "pfeil::getGewicht": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&pfeil::getGewicht", um einen Zeiger auf den Member zu erstellen. 1>d:\....\main.cpp(298) : error C2296: '<': Ungültig, da der linke Operand vom Typ 'int (__thiscall pfeil::* )(void)' ist 1>d:\....\main.cpp(298) : error C2297: '<': Ungültig, da der rechte Operand vom Typ 'int (__thiscall pfeil::* )(void)' istwäre nett, wenn jemand rat wüsste... ist sicherlich nur ein anfänger fehler, glaube ich... vielen dank für die hilfe
-
bool comparision (const pfeil& a, const pfeil& b) { return ( a.getGewicht() < b.getGewicht() ); } vector<pfeil> sortVectorPfeil(vector<pfeil>& myVector) { sort (myVector.begin(), myVector.end(), comparision); return myVector; }Ich habe mir erlaubt noch ein paar andere Änderungen einzufügen.
-
super danke dir funktioniert. was hatte ich denn falsch gemacht? kannste mir das iwie erklären? will nicht einfach so den code kopieren, sondern das verstehen.
ich musste allerdings die const vor den parametern wieder rausnehmen, da ich sonst folgende fehlermeldung bekommen habe:
main.cpp(301) : error C2662: 'pfeil::getGewicht': this-Zeiger kann nicht von 'const pfeil' in 'pfeil &' konvertiert werden
vielen dank nochmal, sehr schnelle hilfe!
-
palmdale schrieb:
was hatte ich denn falsch gemacht?
Zum Beispiel bei
getGewichtdie Parameterliste und beimyVectordie Referenz vergessen.palmdale schrieb:
ich musste allerdings die const vor den parametern wieder rausnehmen, da ich sonst folgende fehlermeldung bekommen habe:
Nein, du solltest besser deine Memberfunktionen, die nichts am Objekt ändern,
const-qualifizieren:float pfeil::getGewicht() const // <-- { return gewicht; }P.S.: drakon, es macht normalerweise nicht sehr viel Sinn, einen Vector zu sortieren und eine sortierte Kopie zurückzugeben.

Naheliegender wäre wohl eine der folgenden Möglichkeiten:// Kopiert myVector, sortiert die Kopie und gibt diese zurück. myVector bleibt unverändert. vector<pfeil> sortVectorPfeil(const vector<pfeil>& myVector) { vector<pfeil> newVector(myVector); sort (newVector.begin(), newVector.end(), comparision); return newVector; } // Sortiert myVector direkt. void sortVectorPfeil(vector<pfeil>& myVector) { sort (myVector.begin(), myVector.end(), comparision); }
-
da fehlt wo noch einiges am grundlagenverständnis...
erst mal zum eigentlichen fehler:
error C3867: "pfeil::getGewicht": Dem Funktionsaufruf fehlt die Argumentliste.
getGewicht ist also eine Funktion - nur, dass du eben die Klammern weggelassen hast - genau das meinte der Compiler hier (die Argumentliste ist zwar in dem Fall leer, aber du hast eben nich ma die Klammern hingeschrieben...)nun zum neuen fehler:
funktionen, die an dem objekt nichts verändern (z.bsp. Getter), werden als const definiert - allerdings hast du das nicht gemacht - wenn du ein const hinter die Fkt an sich schreiben würdest, würde es auch so gehen:class vector { /*...*/ int GetGewicht() const; }bb
-
got it! super danke euch
-
Kopie zurückgeben sollte man bei komplexen Daten tunlichst vermeiden, die Version mit Referenzen ist also vorzuziehen.
-
jencas schrieb:
Kopie zurückgeben sollte man bei komplexen Daten tunlichst vermeiden, die Version mit Referenzen ist also vorzuziehen.
Man sollte es vermeiden, wenn es sich _später_ als Flaschenhals entpuppt - oder wenn man nen uralten Compiler nimmt, der noch kein (N)RVO beherrscht...
Aber ansonsten super, dass du den wohl unqualifiziertesten Beitrag in diesem Thread gegeben hast...bb
-
unskilled schrieb:
Aber ansonsten super, dass du den wohl unqualifiziertesten Beitrag in diesem Thread gegeben hast...
Hat er nicht, spar dir die Beleidigungen.
Sein Einwand ist durchaus gerechtfertigt, wenn er es auch etwas übertrieben hat. Es ist besser, man durchdenkt sein Design so, dass man sich nicht ständig auf irgendwelche Compileroptimierungen verlässt, die mal wirken, mal nicht. Und entgegen der verbreiteten Meinung darf man sich auch Gedanken über Performance machen, bevor man stundenlang vor dem Profiler hockt.
-
Du würdest also eine _eventuelle_ Verbesserung der Performance wählen, wenn du dafür Fkt. wesentlich unintuitiver verwenden musst? Oo
-
unskilled schrieb:
Du würdest also eine _eventuelle_ Verbesserung der Performance wählen, wenn du dafür Fkt. wesentlich unintuitiver verwenden musst? Oo
Wenn ich es mir nicht leisten kann, an dieser Stelle Performance zu riskieren und ich auf mehreren Compilern (von denen möglicherweise nicht alle gleich optimieren können) dasselbe erreichen will, ja. Wenn es natürlich nur um kleine Datenmengen geht, die Performance nicht entscheidend ist oder ich einen Rückgabewert wirklich brauche, nein.
Gegenfrage: Du würdest ein möglicherweise gravierendes Performanceproblem riskieren, nur um deine Funktion "intuitiver" (worüber sich sowieso streiten lässt) zu gestalten?
-
Nexus schrieb:
Gegenfrage: Du würdest ein möglicherweise gravierendes Performanceproblem riskieren, nur um deine Funktion "intuitiver" (worüber sich sowieso streiten lässt) zu gestalten?
Hmm... Japp, würd ich ^^