std::map - wird Instanz automatisch erstellt?



  • hustbaer schrieb:

    Hat etwas gebraucht bis es *ding* gemacht hat... das war kein Verschreiber, oder?
    (An "DrawLine" hab' ich nämlich nichts auszusetzen)

    Ja, ich hätte vielleicht ein eindeutigeres Beispiel wie "ComputeAnzahlElements" bringen können, aber ich hatte den Post schnell zu editieren, damit es überhaupt noch gelesen wird 😉

    Ein tatsächlich vorgekommenes, wirklich schlimmes Beispiel für so ein Gemisch weiss ich leider nicht gerade. Da sich theliquidwave nicht mehr für den Thread zu interessieren scheint – kennt jemand ein solches? 🤡



  • Hey,
    nur weil mein "Problem" augenscheinlich gelöst ist, heißt das nicht, dass ich nicht mitlese 😃

    Kurze Erklärung der Situation: In einem Spiel gibt es bestimmte Events, die per textbasierten Nachrichten ausgelöst werden. Beispielsweise: round_start oder player_spawn . Nun soll es möglich sein, pro Event beliebig viele "Listener" hinzuzufügen. Deshalb pro Key (also pro Eventname) eine std::list.

    Gruß



  • Sorry für die Unterstellung 🙂

    Zu deiner Situation: Ich habe mal ein Event-System implementiert, allerdings mit std::multimap , in der die Keys die Eventnamen und die Values die Listener sind. Aber eine std::list in einer std::map geht auch gut. Hast du eigentlich eine konkrete Frage dazu?



  • Nein, habe ich nicht 😉
    Aber std::multimap kannte ich noch gar nicht. Sieht für meinen Fall eigentlich noch optimaler aus als meine Lösung, oder nicht?

    Beziehungsweise, doch nicht. Wenn ich recht überlege, wird die Durchlaufzeit in einer for-Schleife länger sein, da ich bei meiner Lösung nur einmal nach dem Key suchen muss. Und es kommt hier eher auf die Zeit zum durchlaufen an, als die Zeit, die benötigt wird, um den Listener hinzuzufügen 😉

    Gruß und Danke



  • theliquidwave schrieb:

    Aber std::multimap kannte ich noch gar nicht. Sieht für meinen Fall eigentlich noch optimaler aus als meine Lösung, oder nicht?

    Ich denke mal, es läuft mehr oder weniger aufs Gleiche hinaus. Die Verwendung von std::multimap ist vielleicht etwas weniger komplex, weil du keine verschachtelten Container hast.

    theliquidwave schrieb:

    Beziehungsweise, doch nicht. Wenn ich recht überlege, wird die Durchlaufzeit in einer for-Schleife länger sein, da ich bei meiner Lösung nur einmal nach dem Key suchen muss.

    std::multimap::equal_range() gibt dir die Iterator-Range zurück, innerhalb der sich die assoziierten Werte befinden, und benötigt wie std::map::operator[] O(log n). Du musst auch nur einmal nach dem Key suchen. Oder hab ich das falsch verstanden?



  • Naja, bei meiner Methode mache ich einfach einen Zugriff auf:

    for (bla::iterator it2 = it->second.begin(); it2 != it->second.end(); ++it2)
    

    und fertig. Soweit ich das verstanden habe, muss ich bei std::multimap folgendes machen:

    for (bla::iterator it = this->m_Map.find(name); it != this->m_Map.end(); it = this->m_Map.find(name))
    

    Was nach logischer Beurteilung langsamer wäre.

    Gruß



  • Man könnte ein set<pair<event_id, listener_ptr>> oder sowas in der Art verwenden.



  • Danke, werde ich mir mal anschauen. Aber ich denke, dass ich eher bei meiner Lösung bleiben werde.

    Gruß



  • theliquidwave schrieb:

    Soweit ich das verstanden habe, muss ich bei std::multimap folgendes machen:

    for (bla::iterator it = this->m_Map.find(name); it != this->m_Map.end(); it = this->m_Map.find(name))
    

    Was nach logischer Beurteilung langsamer wäre.

    Nein, du sollst ja equal_range() und nicht find() benutzen.

    Warum sollte überhaupt der genau gleiche find() -Aufruf mehrere Male nacheinander etwas Unterschiedliches zurückgeben, wenn du die Elemente nicht entfernst? Ich frage, weil dieser Aufruf im Aktualisierungsteil deiner For-Schleife steht.



  • Das ist natürlich eine Sache, die ich völlig vergessen habe. Da muss ich dir Recht geben 😉

    Gruß


Anmelden zum Antworten