Strings sortieren

Thomasio

Erfahrenes Mitglied
Alles was ich an fertigen sort() Funktionen finde sortiert Grossbuchstaben vor Kleinbuchstaben, 10 vor 2 oder ähnliches
Muss ich das wirklich zu Fuss machen, oder gibt es eine fertige Funktion die ein Array von Strings wie folgt sortieren kann (ich brauche nur Buchstaben, Zahlen, Leerstellen und Unterstrich, andere Zeichen wie ! ? = oder Umlaute kommen im Array nicht vor)

.... // Leerstelle
_ .... // Unterstrich
0 ....
1 ....
2 ....
3 ....
4 ....
5 ....
6 ....
7 ....
8 ....
9 ....
10 ....
11 ....
.... // usw
A ....
a ....
B ....
b ....
C ....
c ....
...... usw
 
Alles was ich an fertigen sort() Funktionen finde sortiert Grossbuchstaben vor Kleinbuchstaben, 10 vor 2 oder ähnliches
Muss ich das wirklich zu Fuss machen, oder gibt es eine fertige Funktion die ein Array von Strings wie folgt sortieren kann
Ja, so eine Mischsortierung (einerseits numerisch, andererseits lexikografisch) mußt du manuell machen. Du mußt allerdings nur ein Vergleichsfunktion definieren, die 2 Strings vergleicht und einen Wert kleiner 0, gleich 0 oder größer 0 zurückgibt wenn der erste Wert kleiner, gleich bzw. größer als der zweite String ist. Dann kannst du die Standardfunktion sort mit dem Array und der Funktion aufrufen.

Gruß
 
Danke für die Antwort, ich werde mich mal dran setzen, aber mit meinen bescheidenen Kenntnissen wird das wohl etwas länger dauern
 
Nachdem ich mich die letzten 2 Tage quer durch alles gelesen habe was ich hier und anderswo zum Thema sortieren gefunden habe, mache ich dieses Thema nochmal auf, denn ich verstehe Bahnhof und davon ne ganze Menge

Zum Einen fehlt mir scheinbar die ganz grundlegende Idee vom sortieren, zum Anderen bringe ich ständig alles durcheinander

Beispiel:

std::string mystring = "Erwin hat 3 Hüte!Otto hat 4 Hüte!Maria hat 4 Kleider!Willy isst 2 Äpfel!Erwin isst 3 Äpfel";

Das ist ein string voll substrings, durch ! getrennt, mit jeweils 4 Wörtern
Nun will ich die substrings auf alle möglichen Arten sortieren, nach Namen alphabetisch, nach Verb alphabetisch, nach Anzahl auf- und absteigend, nach Objekt alphabetisch usw, dabei Gross-/Kleinschreibung ignorieren und bei gleichem Inhalt ein zweit- und dritt-Kriterium verwenden

Mal angenommen ich habe wenigstens die Grundbegriffe verstanden, dann muss ich den String zuerst mal teilen und alle Teile in ein array packen
Danach müsste ich jeden Eintrag im Array in seine Wörter zerlegen und dann anhand dem gewünschten Wort (oder zahl) sortieren

Genau genommen ist bei mir schon an der Stelle gross/klein ignorieren Schluss, aber auch wenn ich den Teil mal überspringe, dann bringe ich die Sortierung trotzdem nicht auf die Reihe, von zweit-Kriterium bei gleichen Einträgen gar nicht erst zu reden

Wahrscheinlich stelle ich mich einfach nur zu blöd an, gibt es dazu vielleicht ne Erklärung für Doofe?
Ein längerer Code den man einfacher verstehen kann mit viel Kommentar dazwischen wäre mir zumindest am Anfang viel lieber als eine supergeniale Konstruktion aus Hyroglyphen
 
Hat sich wieder erledigt, ich habe aus der Kombination mehrerer Seiten eine Lösung basteln können

Falls es noch jemanden interessiert, hier die Code Schnipsel, die in Kombination das Bild ergeben:

Code:
std::stringstream s(mystring); 
std::vector<std::string> strings; 
std::string temp; 

while (std::getline(s, temp, "!"))     
        strings.push_back(temp); 

std::sort(strings); 

// rückwärts sortieren

std::sort( strings, myGreaterThan);

// Die Vergleichsfunktion muß extra definiertwerden:

bool myGreaterThan( const string &a, const string &b)
                  {
                    return (a > b);
                  }

// mit ein paar sinnigen vergleichsoperationen in myGreaterThan() kann man dann wirklich beliebig sortieren,
// auch mit zweit und dritt Kriterien und sogar inkl:

#include <cctype> // for toupper
#include <algorithm>

string s="hello";

std::transform(s.begin(), s.end(), s.begin(), (int(*)(int)) toupper); // toupper
std::transform(s.begin(), s.end(), std::back_inserter(s1), std::tolower); // tolower

// und am Ende baut man es einfach wieder zusammen:

std::stringstream result; 
std::copy(strings.begin(), strings.end(), 
        std::ostream_iterator<std::string>(result, "!")); 

mystring = result.str();

Das ist so dicht an dem was ich aus php schon kenne, das schaffe ich auf jeden Fall
 
Zurück