Kann man Elemente von vector<XYZ> sortieren???



  • Hallo,

    wie kann ich mit einem vector die Z-Koordinate von mehreren Punkten aufsteigend sortieren? Ich krieg's mit sort() nicht hin!

    class XYZ{
    public:
    	double X, Y, Z;
    };
    
    vector<XYZ> t_vXYZ;
    vector<XYZ>::iterator t_Ibeg;
    t_Ibeg = t_vXYZ.begin();
    vector<XYZ>::iterator t_Iend;
    t_Iend = t_vXYZ.end();
    sort(t_vXYZ.begin(), t_vXYZ.end()); //? das funktioniert nicht! Ich will die Koordinaten nach Z sortieren!!
    sort(t_Ibeg->getZ(),t_Iend->getZ)); // is ja irgendwie auch falsch
    


  • du musst entweder einen passenden operator< schreiben, oder ein passendes prädikat...



  • Hallo,

    sort(t_vXYZ.begin(), t_vXYZ.end());
    

    ist im Prinzip korrekt. Du mußt nur noch sagen, wie Du sortieren willst, nämlich wann ein Vektor v1<v2 ist.
    Dazu kannst Du zum Beispiel den operator< überladen:

    bool operator< (const XYZ & lhs, const XYZ & rhs)
    {
      return lhs.Z < rhs.Z;
    }
    

    sollte das für Deinen Fall erledigen.

    Alternativ kannst Du auch einen Funktor bzw. Funktion für den Vergleich bauen und den dann an sort übergeben.

    MfG Jester



  • du schreibst eine Vergleichsfunktion und übergibst sie an sort:

    bool compare(XYZ const& a, XYZ const& b)
    {
      return a.Z < b.Z;
    }
    ...
    sort(v.begin(), v.end(), compare);
    


  • Muss ich dann für compare einen Funktionspointer setzen?



  • Was soll das sein, einen Funktionspointer setzen? Das geht so, wie ichs geschrieben habe.



  • Hallo,

    ich krieg folgende Fehlermeldung:
    Konvertierung des Parameters 3 von 'bool (class Point3D &,class Point3D &)' in 'bool (__thiscall *)(class Point3D &,class Point3D &)' nicht moeglich

    #include "Block.h"
    #include "Point3D.h"
    
    //////////////////////////////////////////////////////////////////////////////
    // Sort 
    // 
    
    void
    Block
    ::sortZ(const LTDouble& a_dTileSizeX, const LTDouble &a_dTileSizeY)
    {
    	sort(m_vLaserPoints.begin(),m_vLaserPoints.end(),compare);
    }
    
    //////////////////////////////////////////////////////////////////////////////
    // Compare Z-Coordinates
    // 
    
    bool
    Block
    ::compare(Point3D& t_rPoint1,Point3D& t_rPoint2)
    {
    	return t_rPoint1.getZ() < t_rPoint2.getZ();
    }
    


  • die Vergleichsfunktion darf keine nicht-statische Memberfunktion sein.



  • wenn ich's so schreib

    bool 
    Block 
    ::compare(const Point3D& t_rPoint1,const Point3D& t_rPoint2) 
    { 
        return t_rPoint1.getZ() < t_rPoint2.getZ(); 
    }
    

    krieg ich auch ne Fehlermeldung.



  • Das ist ja auch immer noch eine nicht-statische Memberfunktion. Entweder du machst sie zu einer statischen Memberfunktion, oder du nimmst sie aus der Klasse heraus. So geht es jedenfalls nicht.



  • Sorry, aber ich hab echt keine Ahnung, wie ich eine statische Memberfunktion machen soll 😕

    Darf bool compare() nicht zu einer Klasse gehören???



  • Darf bool compare() nicht zu einer Klasse gehören???

    Entweder das, oder du schreibst vor den Funktionsprototyp ein static, um sie statisch zu machen.

    MfG MAV



  • Das gehört aber zum Grundwissen. Naja was solls: Eine statische Memberfunktion deklarierst du mit dem Schlüsselwort static:

    class Foo {
    public:
      static void blub();
    };
    

    Das bedeutet, dass man diese Funktion einfach so aufrufen kann Foo::blub(), ohne eine Instanz, auf der sie als Methode aufgerufen wird (obwohl Foo f; f.blub(); auch erlaubt ist, aber nicht mehr tut als der vorherige Aufruf). Man spricht auch von Klassenmethoden im Gegensatz zu Instanzmethoden.
    Technisch gesehen sind statische Memberfunktionen fast das gleiche wie freie Funktionen, nur dass sie halt in Klassen stehen und damit den Sichtbarkeitsregeln unterliegen ... sie können selbst private, protected oder public sein, und dürfen auf die privaten Member ihrer Klasse und die protected Member der Überklassen zugreifen.


Anmelden zum Antworten