Frage zu map und/oder multimap?



  • Tjoar also ich will eine map benutzen. Allerdings können bei mir Schlüssel mehrfach vorkommen. Daher muss ich doch die multimap benutzen oder?

    Und wie bekomme ich dann die weiteren Werte bei gleichem Schlüssel aus der map? Zu "find(...)" steht bei mir bei beiden, dass sie immer nur den ersten Treffer zurück geben. Daher denke ich erstens das auch eine normale map gleiche Schlüssel akzeptiert udn habe zweitens halt keine Ahnung wie ich an die anderen komme, ohne das ich die vorderen Schlüssel immer aus der map lösche.

    Per Forumssuche habe ich auch nichts passendes gefunden

    MfG Pellaeon



  • Eine map akzeptiert auch gleiche Schlüssel, allerdings wird der alte Wert in der map dann überschrieben. Jeder Schlüssel ist eindeutig.

    Multimaps haben mehrere gleiche Schlüssel (oder besser: können haben), wie du schon richtig erkannt hast. Über multimap.equal_range(key x) bekommst Du ein pair von Iteratoren zurück, mit denen du an die Werte kommst.



  • erstmal danke

    jetzt nur noch zum Verständnis: der erste Iterator ist der unterste Key, der zweite der oberste, und mit Iterator++ muss ich mich solange durchbewegen, bis ich beim 2. Iterator bin ja?



  • Genau. begin und end quasi.

    Mach dir doch einen Bookmark hierrauf: 🙂
    http://www.sgi.com/tech/stl/table_of_contents.html

    Ist zwar beim ersten Gucken etwas unübersichtlich, aber mit der Zeit kommt man damit gut zurecht. Und es lässt kaum Fragen aus. (außer leider zur IOstreams Bibliothek - aber dafür gibt's andere Seiten wie www.cppreference.com)



  • multimap.equal_range nutz ich fast nie zum iterieren.

    versuchs mal mit:

    multimap<T1,T2>::iterator it_end = map.upper_bound(x);
    for(multimap<T1,T2>::iterator it = map.lower_bound(x); it != it_end; ++it)
    {
    }
    


  • Ausm Standard:

    equal_range: equivalent to make_pair(a.lower_bound(k), a.upper_bound(k))

    Ich find den equal_range Aufruf schöner, da er mir beides zusammen auf einmal liefert. Letztendlich wohl aber Geschmackssache.



  • Man benutzt eine multimap und ermittelt z.B. mit find() einen Iterator auf den ersten Schluessel. In einer Schleife liest man dann solange, bis der Schluessel sich aendert (also mittels iter->first, und iter++).



  • Power Off schrieb:

    Man benutzt eine multimap und ermittelt z.B. mit find() einen Iterator auf den ersten Schluessel. In einer Schleife liest man dann solange, bis der Schluessel sich aendert (also mittels iter->first, und iter++).

    Was soll jetzt diese Antwort? Die richtige Antwort steht doch bereits im Thread.



  • hmmmmmmm schrieb:

    Was soll jetzt diese Antwort? Die richtige Antwort steht doch bereits im Thread.

    Mein Vorschlag funktioniert ohne equal_range(), und ohne upper_bound() / lower_bound().



  • Und was hast Du davon? Du gehst eh schon auf spezielles Verhalten ein - containerunabhängig ist deine Lösung also nicht - im Gegenteil, sie enthält eine versteckte Implikation (Container = multimap / multiset).

    Warum nicht einfache elementare Operationen der multimap benutzen, die den Code viel leichter verständlich machen?

    Die STL Algorithmen können zudem immernoch spezialisiert und effektiver als deine handgeschriebenen Schleifen sein.



  • 7H3 N4C3R schrieb:

    Und was hast Du davon? Du gehst eh schon auf spezielles Verhalten ein - containerunabhängig ist deine Lösung also nicht - im Gegenteil, sie enthält eine versteckte Implikation (Container = multimap / multiset).

    Ich dachte, hier ging's um multimaps.

    7H3 N4C3R schrieb:

    Warum nicht einfache elementare Operationen der multimap benutzen, die den Code viel leichter verständlich machen?

    Meinst Du find() und Iteratoren sind keine elementaren Elemente der MultiMap?

    7H3 N4C3R schrieb:

    Die STL Algorithmen können zudem immernoch spezialisiert und effektiver als deine handgeschriebenen Schleifen sein.

    Das kommt wirklich drauf an, was mit dem Bereich nachher geschehen soll. Iteratoren sind ja gerade dafuer gedacht, den Container auszulesen.



  • Warum strickst Du deine Lösung dann an der multimap vorbei? (deshalb meine Annahme, sie soll besonders generisch sein - wo sonst liegt der Grund?) Sie enthält speziell für das beschriebene Problem upper_bound und lower_bound.

    Mit lower- und upper_bound hast Du außerdem das natürliche Verhalten von Iteratoren in der STL - du läufst von einem definierten Anfang bis zu einem definierten Ende. Und prüfst nicht etwa nach jedem Iterator, ob Du noch weiter darfst.



  • 7H3 N4C3R schrieb:

    Warum strickst Du deine Lösung dann an der multimap vorbei? (deshalb meine Annahme, sie soll besonders generisch sein - wo sonst liegt der Grund?) Sie enthält speziell für das beschriebene Problem upper_bound und lower_bound.

    Mit lower- und upper_bound hast Du außerdem das natürliche Verhalten von Iteratoren in der STL - du läufst von einem definierten Anfang bis zu einem definierten Ende. Und prüfst nicht etwa nach jedem Iterator, ob Du noch weiter darfst.

    Mit upper_bound() und lower_bound() suche ich mindestens zweimal nach dem Schluessel. Mit find() bloss einmal, dafuer muss ich die Schluessel manuell vergleichen. Was schneller ist, haengt natuerlich vom Anwendungsfall (und der STL-Implementation) ab.

    Aber im Prinzip hast Du schon recht.


Anmelden zum Antworten