2015-06-03 17 views
5

sto cercando di ottenere l'elemento con valore massimo da std :: map,trovare elemento con valore massimo da 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; 
} 

perché esso stampa il secondo elemento 2 : -1?

+0

Hmmm ... 'std :: max_element()' sembra confrontare le chiavi della mappa – Levi

+1

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

risposta

9

Tratto da here:

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

Questo, invece di usare std::map::value_comp() (che confronta i valori chiave) esamina il second membro nella coppia, che contiene il valore. Questo usa un'espressione lambda, quindi dovrai compilare con il supporto C++ 11

+1

Sono d'accordo con questa risposta. Potrebbe essere scritto un po 'più generico, però. Se sai che 'm' è di tipo' M', potresti scrivere '[] (const M :: value_type & p1, const M :: value_type & p2)'. È robusto scrivere cambiamenti in 'M', ma qui non ha una direzione indiretta superflua – IceFire

2

http://www.cplusplus.com/reference/map/map/value_comp/

Returns a comparison object that can be used to compare two elements to get whether 
the key of the first one goes before the second. 

e 2> 1. value_comp confronta i chiave valori, non i valori di valore. Perché è così che il C++ rotola.