elemente in mehrdim.array tauschen
-
hallo,
schreibe gerade mein erstes c++ prog und schon probleme...
habe über google leider nix gefunden.also ich habe ein zweidimensionales char array mit unterschiedlichen zeichenketten
Bsp.:
mein_array[0]="abc";
mein_array[1]="accba";
mein_array[3]="accb";
mein_array[4]="abcabcabc";mein ziel ist es die ketten zu sortieren mittels bubblesort, dafür nutze ich eine funktion vergleich() mit einem vorgegebenes alphabet, außerdem ist die länge der ZK (bzw. der 2.dimension) entscheident.
wie kann ich nun, nachdem ich festgestellt habe das z.B. mein_array[1] und mein_array[2] vertauscht werden müssen, die beiden auch tatsächlich und möglichst einfach vertauschen?
mein größtes problem ist halt das die 2.ten dimensionen unterschiedliche längen haben...danke für die hilfe

-
Hi...
Also wenn es nicht unbedingt ein Array sein soll, würde
ich das ganze mit einer list oder einem vector und strings machen.
Ist viel einfacher und auch eher C++, arrays und chars sind eher C.Mit einer list würde das dann so aussehen:
#include <list> #include <string> #include <iostream> using namespace std; int main(){ //Liste und Iterator erstellen list<string> mylist; list<string>::iterator it;; //Liste füllen mylist.push_back("abc"); mylist.push_back("accba"); mylist.push_back("accb"); mylist.push_back("abcabcabc"); //Liste sortieren mylist.sort(); //Liste anzeigen for(it = mylist.begin();it!=mylist.end();it++){ cout<<(*it)<<endl; } }Ausgabe vor sotierung: abc accba accb abcabcabcAusgabe nach der sortierung: abc abcabcabc accb accbaUnd für die list kannst du dir auch eigene Sortierverfahren schreiben
mehr infos findest hier: http://www.cplusplus.com/reference/stl/list/sort.htmlmfg smilingman
-
Du machst es dir umständlich dadurch, dass du nicht die Klasse std::string nutzt ... (dann wäre std::swap für ein einfaches tauschen der Inhalte ausreichend ...)
Weiß nicht ob es ausreicht einfach die Zeiger umzubiegen ... sonst kopier einfach:void swap_cstring(char*& first, char*& second) { char* tmp(new char[std::strlen(first) + 1]); // copy first to tmp std::strcpy(tmp, first); delete [] first; // copy second to first first = new char[std::strlen(second) + 1]); std::strcpy(first, second); delete [] second; // set tmp to second second = tmp; }.
char* array[2] = {"string_01", "string_02" }; std::cout << "#01: " << array[0] << "\n#02: " << array[1] << std::endl; swap_cstring(array[0], array[1]); std::cout << "#01: " << array[0] << "\n#02: " << array[1] << std::endl;...
-
danke für die hilfe bisher.
@smilingman: ja leider muss es ein array sein

@(D)Evil: okay ich glaube das kommt hin, werd es heut mal ausprobieren
-
paddel schrieb:
...
also ich habe ein zweidimensionales char array mit unterschiedlichen zeichenkettenBsp.:
mein_array[0]="abc";
mein_array[1]="accba";
mein_array[3]="accb";
mein_array[4]="abcabcabc";mein ziel ist es die ketten zu sortieren mittels bubblesort ...
Man kann z.B. schreiben :
char mein_array[4] = {"abc", "accba", "accb", "abcabcabc"};Das ergibt ein eindimensionales Array aus Zeigern auf nullterminierte Zeichenketten verschiedenener Länge.
Man kann nach alphanumerischem Vergleich diese Zeiger sortieren.mfg
-
Glaubst du daran, dass das geht?
-
Sorry
char* mein_array[4] = {"abc", "accba", "accb", "abcabcabc"};
-
(D)Evil schrieb:
Glaubst du daran, dass das geht?
@(D)evil
char array[2] = {"string_01", "string_02" };**
das geht mit Sicherheit nicht!

-
(D)Evil schrieb:
sonst kopier einfach:
void swap_cstring(char*& first, char*& second) { char* tmp(new char[std::strlen(first) + 1]); // copy first to tmp std::strcpy(tmp, first); delete [] first; // copy second to first first = new char[std::strlen(second) + 1]); std::strcpy(first, second); delete [] second; // set tmp to second second = tmp; }.
char** array[2] = {"string_01", "string_02" }; std::cout << "#01: " << array[0] << "\n#02: " << array[1] << std::endl; swap_cstring(array[0], array[1]); std::cout << "#01: " << array[0] << "\n#02: " << array[1] << std::endl;...
habe das grad mal so übernommen, funktioniert aber nicht so ganz:
Fehler 3 error C2440: 'Initialisierung': 'const char [10]' kann nicht in 'char **' konvertiert werden c:\dokumente und einstellungen\*****\array.cpp 21 Fehler 4 error C2440: 'Initialisierung': 'const char [10]' kann nicht in 'char **' konvertiert werden c:\dokumente und einstellungen\*****\array.cpp 21 Fehler 5 error C2664: 'swap_cstring': Konvertierung des Parameters 1 von 'char **' in 'char *&' nicht möglich c:\dokumente und einstellungen\*****\array.cpp 23
-
Jap sorry stimmt. Eine Dimension außer acht gelassen ...
-
paddel schrieb:
... mein ziel ist es die ketten zu sortieren mittels bubblesort ...
#include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> void bubble(char** , int); int main() { char* mein_array[4] = {"abc", "accba", "accb", "abcabcabc"}; int N = sizeof(mein_array)/sizeof(char*); bubble(mein_array, N); for(int i = 0; i < N; i++) { std::cout << mein_array[i] << std::endl; } } void bubble(char** array, int elemente) { char* temp; while(elemente--) for(int i = 1; i <= elemente; i++) if(strcmp(array[i-1], array[i]) > 0) // < 0 ==absteigend sortieren { temp = array[i]; array[i] = array[i-1]; array[i-1] = temp; } }
mfg
-
dankeschön
eine frage noch,
und zwar wird die anzahl der zeichenketten (VAR_ANZ) sowie deren MAX_LAENGE erst während der laufzeit festgelegt.ist es richtig wenn ich das array so definiere:
char **mein_array = new char[VAR_ANZ][MAX_LAENGE];und wie übergebe ich dann dieses dynamische zweidimensionale array an die funktion bubble(); ?
-
paddel schrieb:
dankeschön
eine frage noch,
und zwar wird die anzahl der zeichenketten (VAR_ANZ) sowie deren MAX_LAENGE erst während der laufzeit festgelegt.ist es richtig wenn ich das array so definiere:
char **mein_array = new char[VAR_ANZ][MAX_LAENGE];und wie übergebe ich dann dieses dynamische zweidimensionale array an die funktion bubble(); ?
void bubble(char** , int); int main() { int VAR_ANZ = 4; int MAX_LAENGE = 10; char** mein_array = new char*[VAR_ANZ]; for (int i = 0; i < VAR_ANZ; i++) mein_array[i] = new char[MAX_LAENGE]; //z.B.: mein_array[0] = "abca"; mein_array[2] = "abcc"; strcpy(mein_array[1], "abc"); strcpy(mein_array[3], mein_array[2]); bubble(mein_array, VAR_ANZ); for(int i = 0; i < VAR_ANZ; i++) { std::cout << mein_array[i] << std::endl; } } void bubble(char** array, int elemente) { char* temp; while(elemente--) for(int i = 1; i <= elemente; i++) if(strcmp(array[i-1], array[i]) > 0) // < 0 ==absteigend sortieren { temp = array[i]; array[i] = array[i-1]; array[i-1] = temp; } }mfg