map<string, string*>



  • Hey there

    Ich brauche eine Datenstruktur, um Wörter nachzuschauen. Ich stelle mir das als eine map<string, string*> vor. Ich möchte der Struktur einzelne Wörter hinzufügen, welche als Key (also als string) in der Map gespeichert werden, und als mapped Value möchte ich einen Pointer auf den string erhalten. Es soll also stets gelten:
    Value == &Key

    Ziel hierbei ist, dass ich jedem Wort in einem Text eineindeutig einen numerischen Wert (Pointer) zuweisen kann.

    Ich bin neu bei C++ und kenne mich mit der map noch nicht gut aus. Deshalb meine Frage: Wie kann ich das realisieren?

    Hoffe die Problemstellung ist soweit verständlich... 😉



  • Also ich finde, dass du dir da selber die Gedanken machen solltest.

    Am besten lernst du, wenn du selber nachdenkst und es probierst und wenn du auf ein konkretes Problem gestossen bist, dann kannst du Fragen.

    Aber einfach so die Antwort geben soll nicht die Lösung sein.



  • Warum einen Pointer als Value? Welchen Sinn soll das haben? Ich sage nicht das es falsch ist, aber ich verstehe die Design-Entscheidung nicht.



  • Artchi schrieb:

    Warum einen Pointer als Value? Welchen Sinn soll das haben? Ich sage nicht das es falsch ist, aber ich verstehe die Design-Entscheidung nicht.

    Darum finde ich, dass er zuerst mal sorgfältig überlegen sollte, was er machen will.
    Und er hat ja die "Lösung" ja hingeschrieben. Mich nimmt nur Wunder, ob er das nicht auch einfach mal ausprobiert hat.. 🙄



  • Artchi schrieb:

    Warum einen Pointer als Value? Welchen Sinn soll das haben? Ich sage nicht das es falsch ist, aber ich verstehe die Design-Entscheidung nicht.

    Betrachte den Pointer als Hashwert, von dem man jedoch auch wieder auf den ursprünglichen Wert (also den String) schliessen kann. Ich benötige diese Hashwerte als IDs für eine Markov-Kette, möchte also die Übergangswahrscheinlichkeiten von Wörtern in einem Text abspeichern.



  • OK, wenn der Pointer wirklich als Pointer dienen soll, dann ist es i.O.



  • Hast du keine Markov-Kette-Klasse? Oder keinen Markov-Kette-Iterator?

    map<string, markov_kette> mymap;
    // oder
    map<string, markov_kette*> mymap;
    // oder
    map<string, shared_ptr<markov_kette>> mymap;
    


  • Das Problem ist ja jetzt folgendes: Ich muss der Map erst ein Wort hinzufügen. Nur ist zu diesem Zeitpunkt erst der Key (Das Wort) bekannt, aber noch nicht der Value (&Key), da der Key ja noch nicht existiert. Ich muss also zuerst nur den Key einfügen und kann dann den Wert setzen. mymap["Wort"] = (...) kann ich also nicht verwenden.
    Kann ich mit der Methode insert erst mal nur einen Key einfügen und dann den Wert nachträglich definieren? Hab dazu irgendwie keine gute Doku gefunden...



  • Artchi schrieb:

    Hast du keine Markov-Kette-Klasse? Oder keinen Markov-Kette-Iterator?

    Ich benötige ja einen Baum, um die Übergangswahrscheinlichkeiten zu speichern. Mein erster Ansatz, um auf diese zuzugreifen war etwa so:

    Freq = Deg0["Dies"]->Deg1["ist"]->Deg2["eine"]->Deg3["Wortfolge"].Freq;
    

    Die Knoten wären also sowas wie map<string, MarkovNode>. Da diese vielen Stringmaps wohl doch ziemlich overhead gäben, will ich stattdessen IDs für die Strings, also Hashcodes verwenden, also map<int, MarkovNode>. Und in späteren Situationen muss ich jedoch die ID's wieder in strings umwandeln, deshalb dieser Hashcode-Pointer-Mix 😉

    Ich hoffe die Idee ist ungefähr klar...



  • Key ohne Wert wäre bei dir dann doch: mymap["Wort"] = 0; Müsstest natürlich beim Auslesen der Map nur daraufhin abfragen.


Anmelden zum Antworten