operator< definieren [gelöst]



  • Hallo,

    Um meinen Vector zu sortieren möchte ich gerne den < operator meiner Klasse definieren und dann das Ganze via std::sort sortieren:

    typedef std::vector<Node*> NodeVec;
    NodeVec * final_leafs;
    

    Die Node sollte anhand ihrer x/y position sortiert werden. Zuerst nach X, dann nach Y.

    bool operator < (const Node& rhs) {
    	 if(xPos == rhs.getX()) {
    		 return (yPos < rhs.getY());
    	 }
    	 else {
    		 return xPos < rhs.getX();
    	 };
    }
    

    Nun sollte der < Operator doch beim sortieren aufgerufen werden?
    Was allerdings nicht geschieht.

    std::sort(final_leafs->begin(),final_leafs->end());
    


  • Wenn die Bedeutung des operator< nicht ganz klar ist, würde ich ihn nicht überladen, und stattdessen eine Vergleichsfunktion schreiben. Wie soll ein Vektor-ähnliches Konstrukt verglichen werden? Da könnte man den Betrag meinen, die Summe von X und Y, oder zuerst X und dann Y, oder umgekehrt, oder...

    Ausserdem solltest du dafür eine freie Funktion einrichten.

    bool CompareNodes(const Node& Left, const Node& Right)
    {
        if (Left.getX() == Right.getX())
            return Left.getY() < Right.getY();
        else
            return Left.getX() < Right.getX();
    }
    
    std::sort(final_leafs->begin(), final_leafs->end(), CompareNodes);
    


  • Eas geschieht denn dann? Fehlermeldung? Woan siehst du dass er nciht aufgerufen wird? Schon mit dem Debugger durchgegangen? Ohne mehr Infos gibts dazu nicht viel zu sagen. Siehe auch den Thread "Du brauchst Hilfe?"



  • Nexus schrieb:

    Wenn die Bedeutung des operator< nicht ganz klar ist, würde ich ihn nicht überladen, und stattdessen eine Vergleichsfunktion schreiben. Wie soll ein Vektor-ähnliches Konstrukt verglichen werden? Da könnte man den Betrag meinen, die Summe von X und Y, oder zuerst X und dann Y, oder umgekehrt, oder...

    .. ich meinte angegeben zu haben, was ich vergleichen will.
    Wenn nicht, dann scheint mir der Operator< wirklich nicht ganz klar zu sein 😉

    [quote="Nexus"]
    Ausserdem solltest du dafür eine freie Funktion einrichten.

    bool CompareNodes(const Node& Left, const Node& Right)
    {
        if (Left.getX() == Right.getX())
            return Left.getY() < Right.getY();
        else
            return Left.getX() < Right.getX();
    }
    
    std::sort(final_leafs->begin(), final_leafs->end(), CompareNodes);
    

    ... ähm, sorry. Aber ich scheine momentan grad unfähig zu sein das zu verwirklichen. Die Funktion habe ich so übernommen. Das Ganze ist allerdings in einer Klasse eingebunden:

    void Quadtree::printTree(){
    	NodeVec::iterator it;
    	/* sort vector */
    	std::sort(final_leafs->begin(),final_leafs->end(),CompareNodes);
    
    	for(it = final_leafs->begin();it<final_leafs->end();++it){
    		(*it)->printNode();
    	}
    }
    
    class Quadtree {
    public:
    /*
    * . 
    * . 
    */
    	bool CompareNodes(const Node& Left, const Node& Right)
    	{
    	    if (Left.getX() == Right.getX())
    	        return Left.getY() < Right.getY();
    	    else
    	        return Left.getX() < Right.getX();
    	}
    /*
    * . 
    * . 
    */
    
    };
    

    Ergibt den Fehler: error: argument of type 'bool (Quadtree::)(const Node&, const Node&)' does not match 'bool (Quadtree::*)(const Node&, const Node&)'



  • /* edit - sorry war ein doppelpost */



  • pumuckl schrieb:

    Eas geschieht denn dann? Fehlermeldung? Woan siehst du dass er nciht aufgerufen wird? Schon mit dem Debugger durchgegangen? Ohne mehr Infos gibts dazu nicht viel zu sagen. Siehe auch den Thread "Du brauchst Hilfe?"

    Ja, ich setzte einen Breakpoint in meinem operator<. .. der allerdings nie erreicht wurde. Es gibt keine Fehlermeldung aus, allerdings sind die nodes in der liste bei mehrmaligen füllen mit den gleichen nodes immer anders angeordnet.


  • Administrator

    vittel schrieb:

    typedef std::vector<Node*> NodeVec;
    

    Das sagt doch schon alles. Bei Node* wird der operator < für Zeiger genommen.

    Verwende die zweite Version von std::sort , wo du einen Funktor übergeben kannst.

    Grüssli



  • Dravere schrieb:

    vittel schrieb:

    typedef std::vector<Node*> NodeVec;
    

    Das sagt doch schon alles. Bei Node* wird der operator < für Zeiger genommen.

    Verwende die zweite Version von std::sort , wo du einen Funktor übergeben kannst.

    Grüssli

    ... und es funktioniert! 🙂

    Vielen Dank für die Hilfe!


Anmelden zum Antworten