multimap und find aus <algorithm>



  • 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_type nicht pair<Key T> , sondern pair<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)


Anmelden zum Antworten