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 benutze

    bool 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 🙂


Anmelden zum Antworten