Sortieren mit der STL



  • Hi,

    hab ein kleines Verständnisproblem mit den Sortieralgorithmen. Irgendwie ist mir die Verwendung von Vergleichs- und Sortieralgorithmen der STL nicht ganz klar. Mit STL-Containern und Klassentemplates komme ich ganz gut zurecht. Aber wie sortiere ich Container mit eigenen Klassen?

    Ein Beispiel:

    struct vertex
    {
    	std::string	desc;
    	color		color;
    	float		x;
    	float		y;
    }
    
    std::vector<vertex>	list;
    
    fill(list);
    
    // TODO: aufsteigend sortieren von x und y ???
    

    Gibt's irgendwo einschauliche Tutorials dafür?



  • Du must dir halt selbst ein algorithmus schreiben, ich glaub nicht das standart Algorithmen alzuviel mit deiner Klasse anfangen können.



  • Hi

    Dazu musst Du den Operator < und > für Deine eigene Klasse implementieren.
    Dann kannst Du selbst sagen wonach sortiert werden soll. erst x dann y oder umgekehrt.

    hier



  • Storm.Xapek.de schrieb:

    Du must dir halt selbst ein algorithmus schreiben, ich glaub nicht das stan**** Algorithmen alzuviel mit deiner Klasse anfangen können.

    Das ist doch gerade der Trick an der STL, daß es eben doch geht. 😉



  • Wenn man die Vergleichsoperationen der Klasse nicht definieren kann bzw. will, kann man bei der sort-Fkt. auch eine Vergleichsfkt. angeben. Wie müsste die Fkt. für das Beispiel ungefähr aussehen?

    // EDIT:
    Vllt. so:

    bool compare(vertex a, vertex b)
    {
    	if (a.x < b.x)
    		return true;
    	else if (a.x == b.x && a.y < b.y)
    		return true;
    
    	return false;
    }
    
    sort(list.begin(), list.end(), compare);
    


  • So funktionierts. War doch nicht so schwer. 😉



  • Eine Sache vielleicht noch. IMHO solltest du die Funktion nicht compare nennen. compare sieht normalerweise folgendermaßen aus:

    int compare(object &lhs, object &rhs)
    {
        if(lhs ist kleiner als rhs)
            return -1;
        if(lhs ist größer als rhs)
            return 1;
        return 0;
    }
    

    Deine Funktion würd ich [Vertex]Smaller() nennen.



  • warum nicht einfach

    struct vertex
    {
        std::string    desc;
        color        color;
        float        x;
        float        y;
    
        bool operator< (const vertex& other)
        {
            return desc < other.desc && color < other.color && x < other.x && y < other.y;
        }
    };
    

Anmelden zum Antworten