2015-06-03 5 views
5

Ich versuche, das Element mit max-Wert von std :: map zu bekommen,finden Element mit max-Wert von std :: map

int main() { 
    map<int, int> m; 
    m[1] = 100; 
    m[2] = -1; 

    auto x = std::max_element(m.begin(), m.end(), m.value_comp()); 

    cout << x->first << " : " << x->second << endl; 
} 

, warum es das zweite Element druckt 2 : -1?

+0

Hmmm ... 'std :: max_element()' scheint die Schlüssel der Karte zu vergleichen – Levi

+1

http: //en.cppreference .com/w/cpp/container/map/value_comp – juanchopanza

Antwort

9

von here wurde:

auto x = std::max_element(m.begin(), m.end(), 
    [](const pair<int, int>& p1, const pair<int, int>& p2) { 
     return p1.second < p2.second; }); 

Dies statt std::map::value_comp() Verwendung betrachtet das second Element in dem Paar (das den Schlüsselwert vergleicht), die den Wert enthält. Dies verwendet einen Lambda-Ausdruck, so dass Sie mit C++ 11 Unterstützung kompilieren müssen

+1

Ich stimme dieser Antwort zu. Es könnte jedoch etwas generischer geschrieben werden. Wenn Sie wissen, dass 'm' vom Typ' M' ist, können Sie '[] schreiben (const M :: value_type & p1, const M :: value_type & p2)'. Es ist robust, um Änderungen in "M" einzugeben, hat aber eine unnötige Indirektion – IceFire