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.