std::set < Operator überladen



  • hey Leute,

    ich bin grad am C++ lernen und hab eine Übungsaufgabe in einem Buch ohne Lösungen gefunden 😕 und an der verzweifle ich gerade... ich hoff ihr könnt mir dabei helfen!

    Bei der Aufgabe muss ich ein std::SET vom Typ "Ordner" erstellen. "Ordner" ist eine Klasse die ich selbst erstellt habe. Zum dem muss ich noch für das Einfügen von Objekten der Klasse "Ordner" den Vergleichsoperator überschreiben, denn beim std::SET wird mit diesem Operator ja auf doppelte Werte geprüft.

    Ich vermute mal das hier mein Fehler liegt!

    Denn ich weiß nicht, was die SET-Methode für eine Bool-Wert erwartet... TRUE = Doppelter Wert?!? Ich hab mal zum Ausprobieren "FALSE" gesetzt wenn die Werte ungleich sind... (siehe Ordner.cpp)

    MEIN PROBLEM: Ich kann damit beliebig viele "insert-Anweisungen" in der Main machen wie ich will, trotzdem wird nur die erste Insert-Anweisung (abc , def) auf der Kommandozeile ausgegeben...

    Fehlermeldungen gibt es kein...

    Woran liegt das??

    Meine MAIN:

    std::set<Ordner> ord;
    	auto ordner1 = Ordner("abc", "def");
    	auto ordner2 = Ordner("ghi", "xyz");
    	auto ordner3 = Ordner("ab", "cd");
    	ord.insert(ordner3);
    	ord.insert(ordner2);
    	ord.insert(ordner1);
    	for (auto ordner : ord) 
    	{
    		std::cout << ordner << std::endl;
    	}
    

    Meine .cpp:
    Ordner.cpp

    #include "stdafx.h"
    #include "Ordner.h"
    #include <iostream>
    
    Ordner::Ordner(std::string a, std::string b) {
    	name = a;
    	titel = b;
    }
    std::ostream& operator<< (std::ostream& os, const Ordner& ord) {
    	os << ord.name << "," << ord.titel << std::endl;
    	return os;
    }
    
    bool operator< (const Ordner& links, const Ordner& rechts){
    	if (links.name != rechts.name  ) { return false; }
    	return true;
    }
    


  • Patrick123456 schrieb:

    Bei der Aufgabe muss ich ein std::SET vom Typ "Ordner" erstellen. "Ordner" ist eine Klasse die ich selbst erstellt habe. Zum dem muss ich noch für das Einfügen von Objekten der Klasse "Ordner" den Vergleichsoperator überschreiben, denn beim std::SET wird mit diesem Operator ja auf doppelte Werte geprüft.

    Ich vermute mal das hier mein Fehler liegt!

    Denn ich weiß nicht, was die SET-Methode für eine Bool-Wert erwartet... TRUE = Doppelter Wert?!? Ich hab mal zum Ausprobieren "FALSE" gesetzt wenn die Werte ungleich sind... (siehe Ordner.cpp)

    Du verstehst da glaube ich einiges falsch.
    Der < -Operator heißt "kleiner als".
    Es geht als darum einen Operator zu definieren der Zwei Objekte deines Typs auf ihre größe vergleicht, und dann true oder false zurück gibt.

    std::set entspricht einem Binären Suchbaum.

    Beispielsweise könnte man deinen Operator so definieren:

    bool operator< (const Ordner& links, const Ordner& rechts){
        if (links.name.size() < rechts.name.size()  ) {
            return false; 
        }else{
            return true;
        }
    }
    

    So wird nach der Größe der Ordnernamen sortiert.



  • axels. schrieb:

    So wird nach der Größe der Ordnernamen sortiert.

    Das ist hier aber sicher nicht zielführend. Ein set kann nur ein "gleiches" Element enthalten. Daher würden bei dieser Definition von "kleiner" keine zwei Ordner mit gleicher Länge enthalten sein können. Ordner1 und 2 haben beide die Länge 3.

    Es ist daher sehr wahrscheinlich sinnvoller, den operator< einfach lhs.name und rhs.name vergeichen zu lassen. Oder sogar nacheinander name und dann titel zu berücksichtigen.

    An Patrick123456: überlege dir, wie du deine Elemente in eine definierte Reihenfolge bringen kannst bzw. wie du einen Kleiner-Operator sinnvoll definieren könntest. Der operaotr< muss jedenfalls "strict weak ordering" befolgen, d.h. es muss "normale" Eigenschaften des Kleiner-Operators haben. Es muss z.B. gelten, dass aus a<b und b<c folgt, dass a<c. Außerdem darf a<a nie wahr sein.



  • wob schrieb:

    axels. schrieb:

    So wird nach der Größe der Ordnernamen sortiert.

    Das ist hier aber sicher nicht zielführend. Ein set kann nur ein "gleiches" Element enthalten. Daher würden bei dieser Definition von "kleiner" keine zwei Ordner mit gleicher Länge enthalten sein können. Ordner1 und 2 haben beide die Länge 3.

    Ok, zugegeben kein besonders gutes Beispiel...



  • Das ging ja super schnell! 😮 Vielen Dank für die Antworten!
    Ich hab es jetzt hinbekommen!

    DANKE 👍 🙂


Log in to reply