2009-11-11 5 views
0

Comment trier le code ci-dessous par le nom, l'âge et le score ... les trois champsvecteur de tri de plus de 1 champ

#include <string> 
#include <vector> 
#include <algorithm> 

struct student_t 
{ 
     std::string name; 
     int age, score; 
}; 

bool by_more_than_1_field(student_t const &lhs, student_t const &rhs) 
{ 
     // sort by name, age and score 
} 

int main() 
{ 
std::vector<student_t> students; 
// populate students 

std::sort(students.begin(), students.end(), by_more_than_1_field); 
} 

Répondre

5

Vous devez être que votre carefull critères de tri est transitif: si x 'y alors y! < x. S'il n'est pas transitif, le résultat de l'opération de tri dépend de l'ordre du tableau avant l'appel, ce que vous ne voulez probablement pas.

bool by_more_than_1_field(student_t const &lhs, student_t const &rhs) 
{ 
    if (lhs.name < rhs.name) 
     return true; 
    else if (rhs.name < lhs.name) 
     return false; 
    else // name equals. 
     if (lhs. age < rhs. age) 
     return true; 
     else if (rhs. age < lhs. age) 
     return false; 
     else // age and names equals 
     return lhs.score < rhs.score; 
} 
6

je l'écrire comme ceci:

bool by_more_than_1_field(student_t const &lhs, student_t const &rhs) 
{ 
    return lhs.name < rhs.name || 
      lhs.name == rhs.name && lhs.age < rhs.age || 
      lhs.name == rhs.name && lhs.age == rhs.age && lhs.score < rhs.score; 
} 

Cela vous permettra de trier les enregistrements par ordre de priorité en fonction du nom, de l'âge et du score dans cet ordre. Changer les priorités autour devrait être un exercice simple.

+1

Nos réponses sont équivalentes. Il est difficile de dire lequel est le plus facile à lire/maintenir ... – jslap

0
bool by_more_than_1_field(student_t const& lhs, student_t const& rhs) 
{ 
    if(lhs.name < rhs.name) 
     return true; 
    else if(lhs.age < rhs.age) 
     return true; 
    else if(lhs.score < rhs.score) 
     return true; 

    return false; 
} 

est beaucoup plus facile à entretenir que les autres, et plus propre aussi!

+2

Il aura des résultats étranges. Si rhs.name jslap

-1
#include <string> 
#include <vector> 
#include <algorithm> 
struct student_t 
{ 
     std::string name; 
     int age, score; 
}; 

bool by_more_than_1_field(student_t const &lhs, student_t const &rhs){ 
     if(lhs.name ==rhs.name && lhs.age < rhs.age) return lhs.score<rhs.score; 
     if(lhs.name==rhs.name) return lhs.age<rhs.age; 
     return lhs.name<rhs.name; 

} 

Explication: lorsque vous faites un vecteur et d'appliquer une fonction de tri passer cette fonction en tant que paramètre.
ex. vector<strudent_t> st;
puis pour le tri sort(st.begin(),st.end(), by_more_than_1_field)

Qu'est-ce que cela va faire est la fonction accepte deux arguments const de student_t de classe. Il accepte const donc l'objet student_t n'est pas modifiable. Il compare ensuite comme donné en fonction.

+0

Veuillez modifier votre réponse pour inclure une explication de votre code. – RedEyedMonster