vector sortieren mit strings
-
wie sortiere ich in einem vector strings am besten?
ich habe
std::vestor<CString> vec; vec.push_back("Abend"); // dann Morgen, Zora, berta
wenn ich jetzt
sort(vec.begin() to end mache ) // jetzt ausgeben // Abend,Morgen,Zora,berta
das problem ist, er nimmt keine strings, sondern die asccii zahl
das ist aber nicht den effekt den ich wünsche.
ich habe mir überlegt wie ich das so mit char machen würde. sprich char eins und char zwei
ich würde erst in double umwandeln, dann wenn eine zahl 97 oder grösser ist, die mir dann merken und dann 31.5 abziehen
als beispiel
A(65) und a(97)
97 int = 97.0 double dann - 31.5 = 65.5
vergleiche dann 65 und 65.5
jetzt kommt A dann a und wen ich B hätte ( 66 ) hätte ich meine reichenfolge ( später nicht vergessen die 31.5 wieder dazuzuzählen )A dann a dann B
anstatt
A dann B dann aDas problem ist ja, ich müsste alles von hand machen.
sprich die länge des vectors durchgehen, dann z.b. bubblesort anwenden, immer per hand vergleichen die 31.5 z.b. abziehen und dann für jeden CString und wenn ich ja zwei vergleiche dann noch die länge des strings
denn ist ja nicht ein einzelnes zeichen wie bei char
das muss doch einfacher gehen. gibts da nichts fertiges? habe mal was gehört den std::greater zu überladen, aber wie genau?
kann man also in der STL einen string vector nicht sortieren ohne tricks?
-
Man kann sort auch selbst spezielle Vergleichsfunktionen übergeben oder aber eine eigene Klasse und darin < benutzen.
Bye, TGGC (Keine Macht den Dummen)
-
Bubblesort muss man _nie_ machen. Man kann immer intelligente Sortierverfahren einsetzen. Eigene Intelligenz natuerlich vorausgesetzt.
-
scalar schrieb:
Bubblesort muss man _nie_ machen. Man kann immer intelligente Sortierverfahren einsetzen. Eigene Intelligenz natuerlich vorausgesetzt.
aha, gut das auch gleich alternativen aufgezeigt werden ( wie z.b. quicksort )
Hat noch niemand von euch nach strings sortieren müssen und kann mir einen brauchbaren tipp geben?
-
:-)))) schrieb:
Hat noch niemand von euch nach strings sortieren müssen und kann mir einen brauchbaren tipp geben?
Ja. s.o.
Bye, TGGC (Keine Macht den Dummen)
-
ich kriegs nicht bebacken mit der sortier funktion
es gibt zwar welche die sortieren aber wieder zuerst die gross und dann die kleinbuchstaben
dann habe ich im internet noch die gefunden, die aber komisch ist
bool NumericGreaterThan2(const std::string& lhs, const std::string& rhs) { return atof(lhs.c_str())>atof(rhs.c_str()); }
bei
vector<string> vec; vec.push_back("A"); vec.push_back("B"); vec.push_back("a"); vec.push_back("d"); vec.push_back("E");
bekomme ich jetzt
A
B
a
d
Ehat also nichts sortiert. die andere die ich gefunden habe, sortiert wie "normales" sort
meine überlegung mit der falschen funktion war
bool NumericGreaterThan(const std::string& lhs, const std::string& rhs) { double d1 = atof( lhs.c_str() ); double d2 = atof( rhs.c_str() ); cout << "d1: " << d1 << " d2: " << d2 << endl; // hier ist d1 und d2 immer 0 :( bool b1; bool b2; if( d1 == 97 || d1 > 97 ){ d1 = d1 - 31.5; b1 = true; } if( d2 == 97 || d2 > 97 ){ d2 = d2 - 31.5; b2 = true; } if( d1 > d2 ){ return atof(lhs.c_str())>atof(rhs.c_str()); } else { return atof(lhs.c_str())<atof(rhs.c_str()); } }
ich habe weil ein string ja länger als ein double ist, zuerst den ersten buchstaben mit substr genommen diesen einen dann umgewandelt und mit dem vergliechen.
also z.b. "Allo", dann nehm ich das "A" in ein char das in ein double rein.
Hat aber auch nicht funktioniert
kann mir jemand einen tipp geben für
bool Itworks ......
dass mein aufruf dann funktioniert
sort( vec.begin(), vec.end(), Itworks );
Ist ja nicht so, dass ich völlig untätig gewesen wäre.
-
alles klar!!!!
warum???
ich braucht ja CString anstass string
dachte es wäre analog
Bei CString habe ich ja die Make_Lower funktion. ich wollte es mal testen. dann dacht ich mir, ich mache den CString kleiner, und dann merke welche position ich kleiner gemacht habe. das beste ist, ich muss mir nichts! merken und es geht trozdem. warum? ich dachte der string wäre verändert
... class CStringCompare2 { public: //Return true if s1 < s2; otherwise, return false. bool operator()(const string s1, const string s2) { CString str1 = s1.c_str(); CString str2 = s2.c_str(); str1.MakeLower(); str2.MakeLower(); return strcmp(str1, str2 ) < 0; //return strcmp(s1.c_str(), s2.c_str() ) < 0; } }; int main() { vector<string> vec; vec.push_back("Alles"); vec.push_back("BARTA"); vec.push_back("a"); vec.push_back("d"); vec.push_back("E"); sort( vec.begin(), vec.end(), CStringCompare2() ); for ( int i = 0; i < vec.size(); i++) { cout << vec[i] << endl; } }
-