4 Stimmen

Verwendung von qsort() mit Klassenzeigern

Ich verwende die eingebaute Funktion qsort() zum Sortieren eines Vektors von class item Zeigern.

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;
}

Im Debugger-Modus können Zeiger weder pa noch pb auf einen gültigen Ort verweisen. Menge aller Datenmitglieder der class items die entweder durch pa o pb Müllwerte enthalten. Wo mache ich einen Fehler? Ich bin mir auch nicht sicher über die Verwendung von Doppelzeigern.

Danke.

6voto

Fred Larson Punkte 58721

Ich stimme den Antworten zu, die empfehlen, die std::sort . Aber abgesehen davon denke ich, dass der Grund für Ihr Problem darin liegt, dass Sie die Adresse der vector Objekt, nicht den Inhalt des Vektors. Versuchen Sie dies:

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

Nachdem Sie das ausprobiert haben, gehen Sie zurück und verwenden std::sort stattdessen. 8v)

4voto

Mark B Punkte 93261

Verwenden Sie nicht qsort in C++, verwenden Sie std::sort stattdessen:

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

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

3voto

UmmaGumma Punkte 5753

Verwenden Sie std::sort von algorithm . Es ist einfach zu benutzen, typsicher und schneller als qsort und hat keine Probleme mit Zeigern :).

#include <algorithm>

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

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X