unordered_multimap - Iteration das Ergebnis von find() liefert Elemente mit unterschiedlichen Wert
Die multimap in C++ zu funktionieren scheint wirklich seltsam, ich würde gerne wissen, warum
#include <iostream>
#include <unordered_map>
using namespace std;
typedef unordered_multimap<char,int> MyMap;
int main(int argc, char **argv)
{
MyMap map;
map.insert(MyMap::value_type('a', 1));
map.insert(MyMap::value_type('b', 2));
map.insert(MyMap::value_type('c', 3));
map.insert(MyMap::value_type('d', 4));
map.insert(MyMap::value_type('a', 7));
map.insert(MyMap::value_type('b', 18));
for(auto it = map.begin(); it != map.end(); it++) {
cout << it->first << '\t';
cout << it->second << endl;
}
cout << "all values to a" << endl;
for(auto it = map.find('a'); it != map.end(); it++) {
cout << it->first << '\t' << it->second << endl;
}
}
dies ist die Ausgabe:
c 3
d 4
a 1
a 7
b 2
b 18
all values to a
a 1
a 7
b 2
b 18
warum nimmt der Ausgang immer noch alles enthalten, mit b als Schlüssel, wenn ich explizit gefragt, für 'einen'? Ist das ein compiler-oder stl-bug?
InformationsquelleAutor Arne | 2012-01-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
find
, wie umgesetzt werden, gibt einen iterator für das erste element mit dem Schlüssel in der multimap (wie mit jeder anderen Karte). Sie sind wahrscheinlich auf der Suche nachequal_range
:Ich habe
->
glücklich.InformationsquelleAutor user7116
Das ist kein bug, es ist gewollt.
find
gibt einen iterator auf eine der übereinstimmenden Elemente, das ist alles. Sie werden Durchlaufen, bis das Ende der Karte mit dem Konstrukt.Müssen Sie
multimap::equal_range
zu tun, was Sie sind nach.InformationsquelleAutor Mat
Es gibt ein Beispiel in http://www.cplusplus.com , über die Verwendung von equal_range-Methode, um alle Elemente mit dem gleichen Schlüssel.
Bitte den link : http://www.cplusplus.com/reference/unordered_map/unordered_multimap/equal_range/
Lassen Sie mich anders formulieren, dass (die review-Mechanismus lässt Sie nicht spezifische Anmerkungen machen und Sie sind eine Auswahl aus einer Liste): OP fragte, "Warum ist X geschehen?" - Ihre Antwort, während Sie möglicherweise nützlich im Allgemeinen, ist nicht eine Erklärung, was passiert mit Ops-code. So, keine Antwort.
InformationsquelleAutor Gamma Liu
Es scheint, dass Sie bekommen einen iterator in die vollständige "Liste" von Paaren, beginnend bei der ersten paar, die mit 'a', wie es die Schlüssel. Also, wenn Sie Durchlaufen bis zum Ende, natürlich werden Sie alles bekommen, was jenseits von 'a' als gut. Wenn Sie gesucht, 'c', Sie würde wahrscheinlich Durchlaufen die gesamte "Liste" zu tun, was Sie tun. Vielleicht sollte man Durchlaufen, um "! = Karte.Ende() && er->first == 'a'", wenn Sie wollen alle das eine.
InformationsquelleAutor user1130005