4 votes

Utilisation de qsort() avec des pointeurs de classe

J'utilise la fonction intégrée qsort() pour trier un vecteur de class item des pointeurs.

class item {
int value;
vector<char> c;
...
...
};

//Declaration of vector
vector<item*> items;

//Function Call
qsort(&items, items.size(), sizeof(item*), value_sort);

int value_sort(const void* a, const void* b)
{
item* pa = *(item**) a;
item* pb = *(item**) b;

if (pb->value < pa->value)
    return 1;
else if (pa->value < pb->value)
    return -1;
return 0;
}

Dans le mode débogueur, les pointeurs ni pa ni pb pointe vers un emplacement valide. Ensemble de toutes les données membres du class items pointé par l'un ou l'autre pa ou pb contiennent des valeurs erronées. Où est-ce que je fais une erreur ? Je ne suis pas non plus certain de l'utilisation des pointeurs doubles.

Merci.

6voto

Fred Larson Points 27404

Je suis d'accord avec les réponses qui conseillent d'utiliser std::sort . Mais en ignorant cela pour le moment, je pense que la raison de votre problème est que vous passez l'adresse de l'élément vector et non le contenu du vecteur. Essayez ceci :

//Function Call
qsort(&items[0], items.size(), sizeof(item*), value_sort);

Ensuite, après avoir essayé, revenez en arrière et utilisez std::sort au lieu de cela. 8v)

4voto

Mark B Points 60200

Ne pas utiliser qsort en C++, utiliser std::sort au lieu de cela :

int value_sort(item* pa, item* pb)
{
    return pa->value < pb->value;
}

std::sort(items.begin(), items.end(), value_sort);

3voto

UmmaGumma Points 3154

Utiliser std::sort de algorithm . Il est facile à utiliser, sûr au niveau du type, plus rapide que qsort et n'a pas de problèmes avec les pointeurs :).

#include <algorithm>

inline bool comparisonFuncion( item *  lhs,item  * rhs)
{
    return lhs->value<rhs->value;
}

std::sort(items.begin(),items.end(),comparisonFunction);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X