Comparator in der eigenen Klasse verwenden



  • Hallöchen.

    Ich schreibe mal wieder an meiner Baum-Klasse weiter und hätte da nochmal ne Designfrage.

    Ich hab einen templatisierten Baum Baum<T> geschrieben, der Objekte vom Typ Blatt<T> sortiert, wobei T die eigentlich zu speichernden Daten sind.

    Jetzt ist ja für T nicht immer der operator< erklärt. Wenn ich zum Beispiel als T einen Pointer auf irgendwas nehme, dann wirds sowieso Mist, weil operator<(irgendwas*, irtgendwas*) geht ja irgendwie gar nicht. Darum macht man sich eine Compare-Klasse wie zum Beispiel die (zum Vergleich von Vertex-Pointern):

    class VertexPtrComparator
    {
      int operator()(const Vertex* v1, const Vertex* v2)
      {
        return *v1 < *v2; // "operator<" wurde sinnvoll in Vertex definiert
      }
    }
    

    Darum wollt ich das wie zum Beispiel bei make_heap aus der STL machen, dass ich einfach ein optionales Argument im KOnstruktor angebe, das so eine VertexPtrComparator-Klasse zum Beispiel annimmt.

    Jetzt ist meine Frage wie ich das mache. Ich könnte ja alle Vergleiche ersetzen:

    // Statt
    if(node1->data < node2->data) //...
    // einfach
    if(comparator(node1->data, node2->data)) // ...
    

    Ist das klug das so zu machen oder wie würdet ihr das machen?

    Für einwas habe ich noch keine Idee. Was ist wenn man keinen Comparator mit angibt? Was nehme ich da als default-Wert für dieses Argument?
    Oder keinen default-Wert sondern einen zweiten Konstruktor, der dem comparator irgendwas anderes zuweist?

    Grüße

    Max



  • Max3000 schrieb:

    Ist das klug das so zu machen oder wie würdet ihr das machen?

    Ja, unbedingt.
    Oder

    if(Comparator()(node1->data, node2->data))
    

    um kein solches Objekt als Attribut halten zu müssen.

    Was ist wenn man keinen Comparator mit angibt? Was nehme ich da als default-Wert für dieses Argument?

    std::less



  • volkard schrieb:

    Max3000 schrieb:

    Ist das klug das so zu machen oder wie würdet ihr das machen?

    Ja, unbedingt.
    Oder

    if(Comparator()(node1->data, node2->data))
    

    um kein solches Objekt als Attribut halten zu müssen.

    Auch gut, aber da wird doch jedesmal so ein Objekt erzeugt. Oder wird das wegoptimiert? Hat ja auch keine anderen Member. Da brauch ich ja nicht mal was im Konstruktor machen, sondern mach einfach ein:

    template<typename T, typename Compare=std::less>
    class Baum
    {
    ...
    };
    

    , richtig?

    volkard schrieb:

    Was ist wenn man keinen Comparator mit angibt? Was nehme ich da als default-Wert für dieses Argument?

    std::less

    Genau das hab ich gesucht 🙂 Vielen Dank. Das wars eigentlich auch schon 😃


Anmelden zum Antworten