std::map<string,int>, das größte Element finden, Funktionsobjekt



  • Hallo,

    ich habe eine map und möchte das größte Element daraus finden. Dabei soll nicht der Schlüssel (string) als Kriterium gelten sondern der int-Wert. Habe mir ein Funktionsobjekt gebastelt aber bekomme eine lange template Fehlermeldung geworfen:

    struct cmp_map
    {
    	bool operator()(const std::map<string,int>::iterator &p1,
    		        const std::map<string,int>::iterator &p2)const
    	{
    		return (*p1).second < (*p2).second; 
    	}
    };
    .
    .
    .
    std::map<std::string,int> map_count;	
    std::max_element(map_count.begin(),map_count.end(),cmp_map());
    

    Was mache ich falsch? Aus der Fehlermeldung werde ich nicht schlau.

    mfg
    🙂



  • Dein Funktor ist falsch, es werden std::map<>::value_types verglichen, nicht Iteratoren. Also:

    struct cmp_map
    {
        bool operator()(const std::pair<const std::string,int> &p1,
                        const std::pair<const std::string,int> &p2) const
        {
            return p1.second < p2.second;
        }
    };
    

    BTW: Auch wenn dir eine Fehlermeldung nichts sagt, ist es doch eine gute Idee, diese mit zu posten. Meist gibt es hier irgendwen, dem sie was sagt...

    Stefan.



  • Es klappt, danke 🙂



  • struct cmp_map
    {
        bool operator()(const std::pair<const std::string,int> &p1,
                        const std::pair<const std::string,int> &p2) const
        {
            return p1.second < p2.second;
        }
    };
    

    vs.

    struct cmp_map
    {
        typedef std::map<std::string, int> Tmap;
    
        bool operator()(Tmap::const_reference p1, Tmap::const_reference p2) const
        {
            return p1.second < p2.second;
        }
    };
    

    bb



  • unskilled schrieb:

    struct cmp_map
    {
        bool operator()(const std::pair<const std::string,int> &p1,
                        const std::pair<const std::string,int> &p2) const
        {
            return p1.second < p2.second;
        }
    };
    

    vs.

    struct cmp_map
    {
        typedef std::map<std::string, int> Tmap;
    
        bool operator()(Tmap::const_reference p1, Tmap::const_reference p2) const
        {
            return p1.second < p2.second;
        }
    };
    

    bb

    Würde ich auch so machen, aber ich wollte halt möglichst nahe am Beispiel bleiben 😉

    Stefan.


Log in to reply