multimap und find aus <algorithm>
-
Hallo,
warum funktioniert folgender (Beispiel-)Code nicht?
#include <map> #include <utility> using namespace std; int main( ) { multimap<int, char> m; typedef multimap<int, char>::iterator IT; pair<IT, IT> pit; IT i; m.insert( make_pair( 1, 'a' ) ); m.insert( make_pair( 5, 'k' ) ); m.insert( make_pair( 5, 'l' ) ); pit = m.equal_range( 5 ); i = find( pit.first, pit.second, make_pair( 5, 'l' ) ); //* m.erase( i ); return 0; }Der Fehler tritt bei * auf und lautet: "error: no match for 'operator==' in '__first. std::_Rb_tree_iterator<_Tp>::operator* [with _Tp = std::pair<const std::string* const, unsigned int>]() == __val'".
Ich kann mir das nicht erklären, zumal pair ja den operator== meines Wissens nach definiert.Kann mir das bitte jemand erklären?
Danke!
Gruß
-
EDIT: oben sollte eigentlich noch ein "#include <algorithm>" in den Code, is aber irgendwie beim C&P verlorengegangen, sorry
-
Hallo,
der Fehler ist in Zeile 19.
Butzi
Euer
LordBritish
IT-Titan, Blondinenflachleger und Audi A3-Fahrer (220PS!)
-
Das weiß ich (und das hab ich auch bereits geschrieben), aber WARUM ist die Zeile falsch?
-
#include <map> #include <algorithm> #include <utility> using namespace std; int main() { multimap<int, char> m; typedef multimap<int, char>::iterator IT; pair<int, char> pit; // <-- IT i; m.insert( make_pair( 1, 'a' ) ); m.insert( make_pair( 5, 'k' ) ); m.insert( make_pair( 5, 'l' ) ); pit = m.equal_range( 5 ); i = find( pit.first, pit.second, make_pair( 5, 'l' ) ); m.erase( i ); return 0; }edit: wobei ich gerade keinen Compiler zur Hand habe
-
Dein Vorschlag ergibt keinen Sinn, weil equal_range ein pair aus zwei Iteratoren zurückliefert und nicht ein Element der (multi!)map.
-
Das Problem liegt daran, dass Du versuchtst ein std::pair<int, char> mit einem multimap<int, char>::iterator zu vergleichen und dazu ist kein == operator definiert.
-
nö, das problem liegt darin, dass
map<Key, T>::value_typenichtpair<Key T>, sondernpair<const Key, T>ist.d.h. die lösung sieht so aus:
i = find( pit.first, pit.second, make_pair<const int, char>(5, 'l')); //oder generell: i = find( pit.first, pit.second, make_pair<IT::value_type::first_type>(5, 'l'));
-
Tut mir leid aber das versteh ich nicht ganz. Warum muss find das pair<int, char> mit pit.first (oder pit.second) vergleichen? (Oder wird der Vergleich woanders ausgeführt, wobei das nicht wirklich Sinn macht, da der Code ohne "find" (und natürlich erase) wunderbar funktioniert.
-
(mein vorheriger post bezog sich auf gysi)
-
Danke, queer_boy!
-
Hm laut Fehlermeldung vergleichst du da irgendwas mit einem pair<const string*, unsigned int>
Bei deinem angegebenen Text kommt bei mir die gleiche Fehlermeldung, allerdings mit pair<const int, char>.
Auf folgende Weise hab ich das Problem beheben koennen:
pit = m.equal_range( 5 ); pair<const int,char> p = make_pair( 5, 'l' ); //NEU!!! i = find( pit.first, pit.second, p); //*Moegen die Goetter wissen, wieso der Compiler da mit dem const durcheinander kommt.
-
Ja, der "string" kommt daher, dass das verbuggte Xcode die Meldungen nicht immer aktualisiert... (ich vermisse linux)