2009-11-02 12 views

Respuesta

81

El final:

m.rbegin(); 

Maps (y juegos) están ordenadas, por lo que el primer elemento es el más pequeño, y el último elemento es el más grande. De forma predeterminada, los mapas usan std::less, pero puede cambiar el comparador y esto, por supuesto, cambiaría la posición del elemento más grande. (Por ejemplo, usando std::greater lo colocaría en begin().

Tenga en cuenta rbegin devuelve un iterador. Para obtener la clave real, utilice m.rbegin()->first. Usted puede envolverlo en una función para mayor claridad, aunque yo "m no estoy seguro si vale la pena:

template <typename T> 
inline const typename T::key_type& last_key(const T& pMap) 
{ 
    return pMap.rbegin()->first; 
} 

typedef std::map</* types */> map_type; 

map_type myMap; 
// populate 

map_type::key_type k = last_key(myMap); 
+7

1 para devolver el último elemento de una manera elegante! – AraK

+0

Esto produce un iterador para el último elemento, pero no para la clave. Tal vez deberías modificar esto para que diga 'm.rbegin() -> first' para que obtengas la clave. –

+3

también podría valer la pena verificar el mapa vacío. – user2672165

11

las entradas en un std :: mapa se ordenan, por lo que para un std :: mapa m (suponiendo m.empty() es falso), se puede obtener la clave más fácilmente: (--m.end())->first

0

A s std :: map es una matriz assosiative que fácilmente puede encontrar la clave más grande o la más pequeña. Por defualt la función de comparación es menor (<), por lo que la clave más grande será el último elemento en el mapa. Del mismo modo, si alguien tiene requisitos diferentes, cualquiera puede modificar la función de comparación al declarar el mapa.

clave std :: mapa <, Valor, comparar < clave, valor>>

Por defecto comparar = std :: menos

Cuestiones relacionadas