Vector sortieren
-
Hallo,
ich habe einen vector<int, double> und will ihn nach dem größten zum kleinsten Element sortieren.
Wie kann ich das am besten anstellen?
Danke schon mal!
-
1. Willst du selber ein Sortierverahren implementieren oder etwas vorgefertigtes verwenden?
2. Du hast ja einen vector<int, double>. Was ist denn das Sortierkriterium? Erst die int-Werte und dann die double-Werte? Du musst eine Ordnung für deine Daten definieren, für die Schlüsselvergleiche.
-
Nur die int-Werte sollen sortiert werden (von groß nach klein) und am besten etwas vorgefertigtes
-
Was ist ein vector<int, double>?
Bei std::sort kannst du eine Funktion angeben, die zum Vergleichen verwendet wird.
-
Alles klar. Ich könnte dir meine eigene Merge-Sort implementierung anbieten
^^ .... oder die Funktion sort aus der Standardbibliothek. Ist im namespace <algorithm> und sollte funktionieren. Hat auch gleich ein Beispiel dabei.
-
Was ist denn ein vector<int, double>? Meinst du nicht eine map?
-
habs hingekriegt, danke!
Eine Frage hab ich noch: ich hab jetzt meinen Vector sortiert und will ihn jetzt durchsuchen mit find(). Das Problem: es kann sein dass der Vector mehrere gleiche Einträge (von double) hat. Wie geb ich die dann mit aus?
Danke schon mal!
-
#include <vector> #include <iostream> #include <algorithm> typedef std::vector<int> Vec; int main() { Vec v; v.push_back(10); v.push_back(12); v.push_back(10); v.push_back(13); v.push_back(10); for (Vec::iterator it = v.begin(); it != v.end(); it = std::find(it + 1, v.end(), 10)) { std::cout << *it << std::endl; } }
Bei der Verwendung mit double könntest du allerdings Probleme aufgrund von Ungenauigkeiten bekommen. Es kann dann sein, dass 2.1 plötzlich nicht gleich 2.1 ist, da die interne Darstellung anders ist.
-
Danke, bekomme aber folgende Compilerfehlermeldung:
C:\Program Files\Microsoft Visual Studio 10.0\VC\include\algorithm(41): error C2678: Binärer Operator '==': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'gefunden' akzeptiert (oder keine geeignete Konvertierung möglich)
......meine Klasse "gefunden" schau so aus:
class gefunden { public: gefunden(){} gefunden(double Theta, double distance1, double distance2, int aX, int aY, int bX, int bY, int mX, int mY, int anzahl, double B): Theta(Theta), distance1(distance1), distance2(distance2), aX(aX), aY(aY), bX(bX), bY(bY), mX(mX), mY(mY), anzahl(anzahl), B(B) {} double getTheta(){ return Theta; } double getDistance1(){ return distance1; } double getDistance2(){ return distance2; } int getaX(){ return aX; } int getaY(){ return aY; } int getbX(){ return bX; } int getbY(){ return bY; } int getmX(){ return mX; } int getmY(){ return mY; } int getanzahl(){ return anzahl; } friend std::ostream& operator<<(std::ostream& ostr, const gefunden& p) { ostr << p.aX << " " << p.aY << "\n"; return ostr; } double getB(){ return B; } double Theta, distance2, distance1, B; int aX, aY, bX, bY, mX, mY, anzahl; };
-
Implementiere Vergleichsoperatoren.
-
ich verstehe nicht ganz.
-
-
Aber ich verstehe nicht warum ich eine Überladung von Operatoren genau jetzt brauche?
class gefunden { public: gefunden(){} gefunden(double Theta, double distance1, double distance2, int aX, int aY, int bX, int bY, int mX, int mY, int anzahl, double B): Theta(Theta), distance1(distance1), distance2(distance2), aX(aX), aY(aY), bX(bX), bY(bY), mX(mX), mY(mY), anzahl(anzahl), B(B) {} double getTheta(){ return Theta; } double getDistance1(){ return distance1; } double getDistance2(){ return distance2; } int getaX(){ return aX; } int getaY(){ return aY; } int getbX(){ return bX; } int getbY(){ return bY; } int getmX(){ return mX; } int getmY(){ return mY; } int getanzahl(){ return anzahl; } double getB(){ return B; } double Theta, distance2, distance1, B; int aX, aY, bX, bY, mX, mY, anzahl; }; typedef std::vector<gefunden> found; . . . . finden.push_back(gefunden(45.21, 21.21, 345.32, 2, 3, 65, 432, 32, 45, 1, 4.0123)); . . . for (found::iterator ilt = finden.begin(); ilt != finden.end(); ilt = find(ilt + 1, finden.end(), most1)) { cout << (*ilt).getaX() << " x " << (*ilt).getaY() << " " << (*ilt).getbX() << " x " << (*ilt).getbY() << " " << (*ilt).getB() << endl; } // Ab der Schleife kommt auf einmal diese Operator Fehlermeldung.
-
Weil std::find zum Finden eine Möglichkeit haben muss, um zu Vergleichen, ob es sich um das gleiche Element handelt.
-
und wie müsste dass dann ausschauen, weil mein Operator nicht funktioniert.
-
Walpurgisnacht schrieb:
und wie müsste dass dann ausschauen, weil mein Operator nicht funktioniert.
Steht im Link oben von jhkhjk unter 3.8
-
OK, danke. Ist eigentlich gar nicht so schwer :p
Ich bekomme jetzt nur noch als Fehlermeldung vom Compiler, dass ich zu viele Parameter benutzebool operator==(gefunden const& lhs, gefunden const& rhs) { return &lhs == &rhs; }
-
Du hast den Operator hoffentlich ausserhalb der Klasse definiert.
class gefunden { /* ... */ }; bool operator==(gefunden const& lhs, gefunden const& rhs) { return &lhs == &rhs; }
-
Ich dachte man kann einen Operator auf zwei Möglichkeiten definieren: innerhalb der Klasse und außerhalb der Klasse. In Zukunft werd ichs immer außerhalb machen
Problem bleibt aber weiterhin:
C:\Program Files\Microsoft Visual Studio 10.0\VC\include\algorithm(41): error C2678: Binärer Operator '==': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'gefunden' akzeptiert (oder keine geeignete Konvertierung möglich)
-
Versuchs mal damit:
bool operator==(gefunden const& rhs);
Diese Funktion so in der Klasse definieren. Dann kannst du das linke Objekt über den this-Operator aufrufen.
PS:
Bin mir nicht so ganz sicher obs klappt. Probiers mal aus