"Container" für beliebig viele Variablen eines beliebigen Types implementieren



  • Ich hätte bei deiner Anforderung erst einmal an eine Hilfsfunktion gedacht, die dann dreimal aufgerufen wird. Für die zweite Ebene evtl. noch eine Hilfsfunktion.

    Ansonsten kann man bei solchen Strukturen schlecht sagen, wie sie dann später jemand benutzen will. Wäre so eine createMultiple Funktion wirklich flexibel und könnte man sie auch für andere Szenarien einsetzen? Ich hab keine Ahnung, so genau hab ichs auch nicht durchgelesen.
    Eine Sequenz einzufügen finde ich aber erstmal nicht abwegig. Vielleicht als Iteratoren, damit man beliebige Container benutzen kann. Und die gibt dann einen "Tree Iterator" zurück, mit dem man über alle eingefügten Knoten drüberlaufen kann (ohne abzusteigen). Sowas könnte ich mir z.B. spontan vorstellen.



  • Morgen,

    Mechanics schrieb:

    und könnte man sie auch für andere Szenarien einsetzen?

    Das Szenario ist ganz allgemein: man möchte mehrere Knoten an einen vorhandenen Knoten anfügen und dabei auch gleichzeitig Kindknoten an die neuen Knoten anhängen.
    Ich möchte die createMultiple-Funktion natürlich so implementieren, dass man beliebige Schemata an einen Node anfügen kann, das Beispiel war eben genau das, ein Beispiel.
    Ich kann mir vorstellen, dass es öfter mal zu Szenarien kommt, in denen der Benutzer mehrere Nodes in einem bestimmten Muster einfügen möchte, z.B. um eine Speicherstruktur einzuhalten/darzustellen.
    Simples Beispiel: Man liest eine XML-Datei ein und benutzt den Container um den Inhalt zu speichern/darzustellen. Dann könnte man mit der createMultiple den Inhalt eines ganzen Feldes nach dem gleichen Schema wie dem in der XML-Datei an einen Knoten anhängen.

    Der Container eignet sich ja hervorragend dafür Strukturen darzustellen. Um bloß Werte zu speichern kann man auch einen schlichten vectorboost::any benutzen.
    Ich nutze den Container momentan für genau so etwas, ich halte darin alle Objekte eines Programms in einem bestimmten Schema. Und ein angenehmer Nebeneffekt: Das schreiben und lesen der Objekte bzw deren Werte in/aus einer Datei ist sehr viel einfacher geworden 😃

    Mechanics schrieb:

    Eine Sequenz einzufügen finde ich aber erstmal nicht abwegig. Vielleicht als Iteratoren, damit man beliebige Container benutzen kann. Und die gibt dann einen "Tree Iterator" zurück, mit dem man über alle eingefügten Knoten drüberlaufen kann (ohne abzusteigen). Sowas könnte ich mir z.B. spontan vorstellen.

    Erkläre mir bitte genauer was du mit beliebige Container meinst.
    Wenn ich dich richtig verstehe meinst du damit, das man über eine Sequenz mehrere Knoten an zum Teil schon existierende Knoten anhängen kann. Interessanter Gedanke aber auch komplex in der Umsetzung. Das würde bedeuten, dass die Schema-Klasse sowohl die Iteratoren für die betreffenden Knoten enthält als auch die Schemata für die anzuhängenen Knoten.
    Einen tree_iterator zurückzugeben finde ich unnötig. Wenn man an mehrere Knoten anhängt kann man nicht ausschließlich über die angefügten Knoten laufen (das würde bedeuten, das ich eine zusätzliche Struktur brauche, die mir die angefügten Knoten speichert und über die der iterator läuft, aus meiner Sicht absolut überflüssig, wann löschen und wo speichern?) und wenn man an nur einen Knoten anfügt hat man bereits einen Iterator zum entsprechenden Node. Sofern man nur über die Kinder eines Knotens laufen möchte ohne abzusteigen nimmt man halt einen ChildIterator, dafür ist er schließlich da 🙂



  • Cherup schrieb:

    Erkläre mir bitte genauer was du mit beliebige Container meinst.

    Vielleicht sowas:

    vector<int> v{1, 2, 3};
    treeContainer::tree tree;
    treeContainer::iterator pos = tree.find(...);
    treeContainer::iterator it = tree.insert(pos, v.cbegin(), v.cend());
    while (it.valid())
    {
     appendMoreChildren(it);
     ++it;
    }
    

    Weiß nicht genau, wie das bei dir von der Syntax aussehen würde. Jedenfalls eine Möglichkeit, aus einer beliebigen Datenquelle über Iteratoren Werte in den Baum einzufügen, die auf einer Ebene liegen. Und man bekommt einen Iterator zurück, mit dem man über die eingefügten Knoten drüberlaufen kann, um weitere Ebenen einzufügen.



  • Hmmm,

    das was du beschrieben hast kannst du doch auch so mit dem Baum machen?

    vector<int> v{1, 2, 3};
    treeContainer::tree tree;
    treeContainer::iterator pos = tree.find(...);
    for(auto vpos = v.cbegin(); vpos != v.cend(); ++vpos) tree.createNode(pos, *vpos);
    treeContainer::iterator it = tree.begin(pos); //holt einen ChilIterator
    while (it != tree.end(pos))
    {
     appendMoreChildren(it);
     ++it;
    }
    

    Ist nur minimal mehr Aufwand. Sofern an dem Knoten schon Kinder hängen ist die Anpassung auch nicht weiter schwer, braucht nur eine zusätzliche Codezeile und etwas andere Schleifenparameter...
    Dafür braucht man meiner Meinung nach keine eigene Container-Funktion.
    Mir geht es ja darum komplexere Daten-Strukturen mit wenigen Befehlen einfügen zu können 🙂
    Zugegeben, es ist nicht nötig, kann aber in manchen Situationen sehr praktisch sein. Ich habe mir eine Hilfsfunktion geschrieben, die genau das macht, so bin ich auch auf die Idee gekommen 🙂

    Aber die Idee mit den Iteratoren finde ich an sich sehr gut und praktisch. Werd mal überlegen, wie man das machen oder kombinieren könnte...


Anmelden zum Antworten