0
votes

Quelle est la meilleure méthode pour trier un tableau dynamique de cordes C dans une classe en C ++?

Dans ma classe de programmation actuelle, j'ai été chargée de créer un programme qui prend un cours d'entrée utilisateur (composé de nom de cours, de grade de cours, de variables d'unités de cours) et de les stocker dans une matrice générée dynamiquement avec une taille maximale de 10.

En raison de mon inconnu avec une programmation orientée objet et des classes, mais je trouve quelque chose au-delà de la création pure des classes pour être très difficile. J'ai trouvé un moyen de créer les entrées, ainsi que de la façon de les modifier après avoir été créé à l'aide de fonctions d'amis (je pense que c'est le nom?) Stocké dans mon fichier d'en-tête de programmes. P>

Cependant, maintenant que je devais effectuer une sorte d'exécution sur les données (par la variable de nom de chaque entrée) ainsi que pour la recherche, je trouve qu'il est très difficile de procéder. Je crois comprendre comment faire des fonctions pouvant faire ces deux choses (comme je l'ai fait pour ma classe précédente), mais le faisant avec des cours en cours d'implantation, prouve un défi. P>

mon fichier d'en-tête: P > xxx pré>

mon fichier source principal: p> xxx pré>

Mes fonctions Fichier source: p>

void swap_ptrs(Course*& pt1, Course*& pt2) //Passes the pointers by reference
{
    Course* tmp = pt1;
    pt1 = pt2;
    pt2 = tmp;
}


3 commentaires

Juste une note: si vous avez un livre enseignant l'utilisation de , ce livre est probablement sérieusement obsolète et ne convient pas à l'apprentissage C ++. La même chose s'applique à un cours ou à un livre qui utilise des tableaux bruts Char pour chaînes.


Votre titre est un peu mal menant. En fait, vous voulez trier des tableaux de pointeurs tout en comparant les chaînes C, n'est-ce pas?


Correct, je veux trier le tableau des pointeurs qui pointent sur les cordes C, mon erreur sur le libellé!


3 Réponses :


1
votes

Vous pouvez utiliser un conteneur comme STD :: Liste ou std :: Vecteur Pour stocker vos objets de cours au lieu d'un tableau et de l'utilisation std :: Trier avec une méthode de comparaison de votre choix. Ce serait probablement le plus facile. Si vous devez vous en tenir à des tableaux en tant que conteneur, vous pouvez également utiliser un type comme celui-ci:

std::sort(array, array + array_size,[](Course* a, Course* b) {
        return strcmp(a->name, b->name) < 0;   
    });


0 commentaires

2
votes

N'utilisez pas de tableau de caractères. Utilisez plutôt la chaîne

   bool mysortfunc(Course c1, Course c2)
   {
    return c1.name<c2.name;
   } 


4 commentaires

On peut utiliser STD :: Trier même sur les tableaux :)


Ma réponse ne dit pas "seulement std :: vecteur".


Dans cet exercice particulier, l'OP définit statiquement la taille de la matrice à 10 et peut-être peut-être qu'un tableau a du sens. Cependant, pour les plus grandes tailles où les tailles statiques ne sont pas un vecteurs donné auront un sens. En empêchant le succès des performances mineures, les vecteurs sont supérieurs aux tableaux, quelle que soit leur taille en matière de redimensionnement et de gestion de la mémoire.


Convenu. Si la taille est connue au moment de la compilation - STD :: Array, sinon STD :: Vecteur.



1
votes

pour le tri, STD :: Trier () peut être utilisé.

Bien sûr, il y a quelque chose d'autre nécessaire - un prédicat moins qui fournit l'ordre prévu - le cours * s par Nom Membres.

Un tel prédicat pourrait être: xxx

qui est lambda (et pourrait être fourni en tant que troisième argument sur std :: Trier () directement).

(une fonction de même signature ferait aussi bien.)

une petite démo pour l'illustration: xxx

sortie: < / p> xxx

Démo en direct sur Coliru < / strong>

trivia:

concernant le format de sortie inhabituel, j'ai utilisé:

Trio - Anna - Lassmichrein lassmichraus


0 commentaires