suchen in multimaps
-
morgen,
ich habe in einer multimap mehrere objekte mit dem selben schlüssel angelegt.
allerdings liefert mir find() nur die erste gefundene position.wie komme ich an die andern objekte mit dem selben schlüssel?
ich habe nun schon mit den iterator herrumexperimentiert, allerdings besitzt dieser keine methode find().
hoffe ihr könnt mir helfen
-
multimap::equal_range
-
Hallo,
die Lösung heißt multimap::equal_range. Diese Methode liefert dir eine Sequenz als Paar von Iteratoren zurück, wobei alle Elemente innerhalb der Sequenz einen zum Suchschlüssel äquivalenten Schlüssel haben:#include <map> int main() { typedef std::multimap<int, int> MyMap; typedef std::pair<MyMap::iterator, MyMap::iterator> Range; MyMap m; // ... Range r = m.equal_range(42); for (; r.first != r.second; ++r.first) { assert(r.first->first == 42); } }
-
Hallo hätte noch eine Frage dazu.
ich glaube ich steh grad aufm schlauch, aber wie greife ich auf den Wert zu wen er eine Klasse ist also ala multimap<CString,Klasse>
int main() { typedef std::multimap<CString, Klasse> MyMap; typedef std::pair<MyMap::iterator, MyMap::iterator> Range; MyMap m; Range r = m.equal_range(42); for (; r.first != r.second; ++r.first) { assert(r.first->first == 42); //hier Zugriff auf Klasse->variable }
-
r.first->firstist das erste Element des Schlüssel/Wert-Paares - also in deinem Beispiel der CString, den zugehörigen Wert erhältst du überr.first->second.(PS: Und wenn du in einer multimap<CString,Klasse> suchen willst, mußt du auch CString's als Suchwerte übergeben und keine int's.)
-
habs auch grad gesehen bei "assert(r.first->first == 42)"
und ich probier da Umwege mit casten : /
aber trotzdem danke : )
-
Hallo,
ich habe eine Multimap<unsigned int, char> bei der den unsigned int Zufallswerten Buchstaben von A-Z zugeordnet wurden. Nun will ich ich einen bestimmten mehrfach vorkommenden Schlüssel suchen und den jeweils zugehörigen Buchstaben ausgeben.Ist die hier angesprochene Methode das Gebot der Stunde? Ich blicke da irgendwie gerade nicht durch^^
-
Ja, die liefert Dir genau alle Elemente, deren Schlüssel zu dem angegebenen äquivalent sind. In Deinem Fall sind das alle mit dem gleichen Schlüssel.
-
Ähm, kann sein das ich gerade etwas durch den Wind aber ich checke einfach nicht wie ich dann darauf zugreife

-
mymap.equal_range(4711)liefert dir zwei Iteratoren auf den Teilbereich deiner Multimap, der alle Elemente mit dem Schlüssel 4711 enthält. Also kannst du über diesen Bereich iterieren, um alle zugehörigen Werte herauszufinden:pair<multimap<unsigned,char>::iterator,multimap<unsigned,char>::iterator range = myMap.equal_range(4711); cout<<Werte zum Schlüssel 4711:\n"; for(mutlimap<unsigned,char>::iterator pos=range.first;pos!=range.second;++pos) cout<<pos->second<<" ";
-
ah, ich habs begriffen

Vielen Dank!:)