0
votes

Triez une gamme de structs par différents membres

J'ai besoin de trier un tableau de structures ayant chacun des membres avec différents types de données à l'aide de QSort.

typedef struct {
 char* name;
 int age;
 float wage;
} employee;


6 commentaires

Réponse courte: oui.


Si vous souhaitez trier par différents membres, vous avez besoin d'un comparateur pour chaque membre.


Je dois fournir à un utilisateur la possibilité de trier les employés par nom par exemple


Très bien merci


Même s'ils sont les mêmes types de données, vous avez besoin de différents comparateurs, car le comparateur doit savoir quel membre comparer, non seulement comment comparer les valeurs.


La seule façon de le faire (de manière portant) avec un seul comparateur consiste à définir une variable globale avant d'appeler qsort , puis vérifiez la variable globale dans le comparateur pour voir quel membre le comparateur. La solution non portable est la fonction qsort_r , ce qui permet de transmettre des informations supplémentaires au comparateur. Voir cette question pour des informations de base sur les problèmes de portabilité avec qsort_r .


3 Réponses :


1
votes

Une fonction de comparaison appropriée pour le tri des objets de type Employee recevra des arguments qui pointent sur employé objets. Que chaque objet a des membres de plusieurs types affecte la manière dont vous impliqueriez une telle fonction, mais cela ne présente pas en soi une raison pour laquelle vous auriez besoin de plus d'une fonction. XXX

Toutefois, chaque comparaison La fonction définit un moyen particulier de trier les objets. Si vous souhaitez fournir le tri sur différents critères, vous avez besoin d'une fonction de comparaison différente pour chaque méthode de commande. Cela n'a rien à voir sur le point de savoir si les membres ont tous le même type de données.


3 commentaires

Je voulais dire que je dois être capable de trier les employés par leur nom, leur âge, etc. séparément


Et cette réponse aborde cela, @ilyakozel.


Je n'ai lu pas jusqu'à la fin, désolé pour ça. Merci de m'aider



1
votes

Dans tous les cas, vous devez écrire une fonction distincte pour chaque membre de données par lequel la matrice sera triée car dans la fonction, vous devez comparer les valeurs des membres de données concrets.

Cependant, vous pouvez écrire une fonction générale qui sera Fournir la fonction de comparaison requise pour un appel de QSort. p>

Voici un programme de démonstration. P>

Tom, 18, 3500.000000
Bob, 26, 4500.000000
Jim, 28, 4000.000000

Bob, 26, 4500.000000
Jim, 28, 4000.000000
Tom, 18, 3500.000000

Tom, 18, 3500.000000
Bob, 26, 4500.000000
Jim, 28, 4000.000000

Tom, 18, 3500.000000
Jim, 28, 4000.000000
Bob, 26, 4500.000000


1 commentaires

Bon usage de const et (a> b) - (A idiome.



1
votes

Cette fonction devrait accomplir ce que vous recherchez:

if (ret1 == 0) {
    int ret2 = strcmp(emp1->name, emp2->name);
    if (ret2 == 0)
        return emp1->age - emp2->age;
    else
        return ret2;
} else if (ret1 > 0) {
    return 1;
} else {
    return -1;
}


3 commentaires

Ainsi, pour effectuer les différentes commandes de tri, vous avez besoin de différentes corps à votre fonction, ou (meilleures et équivalentes) différentes fonctions - pas seulement une seule fonction.


@Jonathanleffler ne serait-ils pas des "blocs" et ne fonctionne pas?


Eh bien, si vous avez un mécanisme tel qu'une variable globale pour indiquer quel 'bloc' ( Déclaration composée ?) Pour exécuter, il pourrait s'agir de "blocs". Mais la variable globale est laide - elle serait plus simple (et sans doute plus performante, bien que à peine mesurable, donc) d'utiliser des fonctions de comparaison distinctes.