Alle Werte eines bestimmten Schlüssels von Multimap ausgeben



  • Hallo zusammen!

    Ich habe beispielsweise diese Multimap:

    std::multimap<int, int> Map;
    Map.insert(std::make_pair(5, 1));
    Map.insert(std::make_pair(5, 2));
    Map.insert(std::make_pair(5, 3));
    Map.insert(std::make_pair(10, 4));
    Map.insert(std::make_pair(10, 5));
    

    Jetzt möchte ich für alle Werte des Schlüssels 5 eine Aktion ausführen, zum Beispiel den Wert ausgeben. Wie muss die Schleife aussehen? (nicht mit std::foreach :p ) 🙂



  • int FindKey = 5;
    for (std::multimap<int, int>.iterator it = Map.lowerbound(FindKy); (it != Map.end()) && (it <=Map.upperbound(FindKy); it ++) 
    {
    // do what you want :-) 
    _ASSERT(it->first == FindKey ) // zum beispiel checken, ob der Key wirklich stimmt :-)
    }
    

    Bin mir aber ned 100%ig sicher ob der <= operator fuer den iterator definiert ist ...

    Ciao ...



  • und falsch geschrieben wars auch ...

    int FindKey = 5;
    for (std::multimap<int, int>.iterator it = Map.lower_bound(FindKy); (it != Map.end()) && (it <=Map.upper_bound(FindKy); it ++) 
    {
    // do what you want :-) 
    _ASSERT(it->first == FindKey ); // zum beispiel checken, ob der Key wirklich stimmt :-)
    }
    


  • wäre hier ein ++it mal wirklich besser als ein it++ 😉
    wieso nicht auch einfach it != map.upper_bound(fndkey)? das ist doch afaik genau gleich geordnet!



  • muss dieses (it != Map.end()) darein? weil ich benutze in meinem programm auch std::multimap und hab das nicht drin und es funktioniert eigentlich 🙄



  • noch was: sind die schlüssel in einer multimap alle geordnet hintereinander? sonst würde das ja irgendwie nicht gehen? 😕



  • Hallo,
    warum nicht einfach equal_range statt lower_bound und upper_bound?

    #include <iostream>
    #include <map>
    using namespace std;
    
    int main()
    {
        typedef std::multimap<int, int> MapType;
        MapType map;
        map.insert(std::make_pair(5, 1));
        map.insert(std::make_pair(5, 2));
        map.insert(std::make_pair(5, 3));
        map.insert(std::make_pair(10, 4));
        map.insert(std::make_pair(10, 5));  
    
        for(pair<MapType::iterator, MapType::iterator> range = map.equal_range(5); 
            range.first != range.second ; ++range.first)
        {
            cout << (range.first)->second << endl;
        }
    
    }
    


  • Hallo,

    Ist bei dem Beispiel von HumeSikkins garantiert das die Ausgabe

    1
    2
    3
    

    ist? (Einfügereihenfolge == Ausgabereihenfolge)

    Oder könnte die Ausgabe auch z.B. 1, 3, 2 oder eine andere Kombination sein?

    Ist das irgendwo festgelegt?



  • Nitram78 schrieb:

    Ist bei dem Beispiel von HumeSikkins garantiert das die Ausgabe

    1
    2
    3
    

    ist?

    Nope. Das wird vom Standard nicht festgelegt.
    Falls du dieses Verhalten unbedingt brauchst, dann solltest du statt einer multimap eine map<Key, list<Value> > nehmen. Und dann immer schön mit push_back in die Liste einfügen.


Anmelden zum Antworten