Array von Pointern sortieren
-
Hi Leute,
ich möchte einen Array von Pointern so sortieren, dass die in ihm gespeicherten Adressen so auf einen Array mit gespeicherten char Zeichenketten zeigen, dass beim dereferenzieren des Arrays von Pointern, mit fortlaufendem Index, die Zeichenketten alphabetisch sortiert sind.
O.K., das Problem lässt sich schon schwierig beschreiben, also auf deutsch:
Ich habe einen zweidimensionalen Zeichenketten Array:
char saveIn[200] [90];
In ihm sind 200 Strings gespeichert.Ein Array von Pointern wurde mit den 200 Anfangsadressen dieses Arrays initialisiert.
Jetzt will ich einfach nur, das Ich über diesen Array von Pointern alle 200 Strings alphabetisch geordnet anzeigen lassen, ohne die ursprüngliche Sortierung im Zeichenketten-Array durcheinander zu bringen.
Frage: Wie mache ich das?
Lösungsvorschlag:
Mit quicksort:
qsort(APsaveIn, 200, (90 * sizeof(char)), APstrcmp);Ich übergebe qsort den Array von Pointern "APsaveIn" und die Anzahl der zu sortierenden Elemente, sowie deren Größe. (oder muss ich die Größe eines Pointers übergeben?) Dann noch -und jetzt wirds heikel- eine Funktion, die die Adressen zweier Elemente des Arrays von Pointern übernimmt.
Diese Funktion muss die ihr übergebenen Pointer dereferenzieren und dann an strcmp (Vergleichsfunktion für Zeichenketten) weitergeben können.
Nur wie, wenn überhaupt, soll das möglich sein, schließlich ist die Vergleichsfunktion aus qsort auch noch so definiert, dass sie eben keine Pointer auf Pointer, sondern nur einfache Pointer übernimmt. Was soll ich machen? Quicksort neuschreiben? Ich bin ratlos.Sorry, dass ich euch so vollgetextet habe, aber mir fiel nicht ein, wie es einfacher gehen sollte,
Ben
-
Also, erst mal nimmt man in C++ für Strings kein char[], sondern std::string. Für Arrays nimmt man keine nackten Arrays, sondern std::vector. Und dann nimmt man auch nicht qsort, sondern std::sort.
Folgende Vorgehensweise:
Eingabedaten folgendermaßen ändern:
std::vectorstd::string saveIn;
Dann einen std::vector<std::string *> erstellen
std::vector<std::string *> Ptr (saveIn.size();
und mit den Zeigern füllen.
Einen Vergleichs-Funktor schreiben. Siehe hierzu auch folgenden Thread:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-160228.htmlund zu guter letzt std::sort aufrufen:
std::sort (Ptr.begin(), Ptr.begin(), funktor());