2011-07-21 22 views
10

¿Cómo ordeno un vector STL basado en dos criterios de comparación diferentes? La función de ordenación predeterminada() solo tiene un único objeto clasificador.Ordenando un vector STL en dos valores

+0

¿Puedes elaborar más? ¿Qué criterios quieres? – iammilind

+0

Más información –

+0

Estoy ordenando una lista de objetos con dos propiedades diferentes: distancia e importancia. Una de las comparaciones de estas propiedades (mayor importancia) anula a la otra (distancia más cercana). Entonces, si las importancias de un objeto son 1 y la otra es 0, se ordenará más que el segundo, incluso si la distancia es mayor. No puedo encontrar una manera de hacerlo con solo una comparación. – toastie

Respuesta

25

Necesita combinar los dos criterios en uno solo. Aquí hay un ejemplo de cómo ordenarías una estructura con un primer y segundo campo basado en el primer campo, luego en el segundo campo.

#include <algorithm> 

struct MyEntry { 
    int first; 
    int second; 
}; 

bool compare_entry(const MyEntry & e1, const MyEntry & e2) { 
    if(e1.first != e2.first) 
    return (e1.first < e2.first); 
    return (e1.second < e2.second); 
} 

int main() { 
    std::vector<MyEntry> vec = get_some_entries(); 
    std::sort(vec.begin(), vec.end(), compare_entry); 
} 

NOTA: aplicación de compare_entry actualizado para utilizar el código de Nawaz.

+0

+1, Adelante hacia adelante. Pensé de la misma manera. Pero aún duda si el OP está pensando en las mismas líneas. – iammilind

+0

Genial, funcionó, ¡gracias! Olvidé la parte if (e1.first == e2.first), así que estaba fallando para mí. – toastie

+2

@Michael: agregué otra implementación de la función 'compary_entry'. Espero que esté bien contigo. :-) +1 BTW. – Nawaz