[gelöst]Mehrere Array Elemente löschen
-
Hallo,
ich möchte in einem Array nach Elementen x suchen und diese löschen, wie mache ich das am besten? Ich habs damit versucht einfach das Array zu kopieren und dabei den Wert zu überspringen der raus soll, aber irgendwo ist ein Fehler den ich nicht finde.
Array[0,1,2,3,4,5,6,7,8,9]
void ExtListe::erase(int val){ int *tmp = new int[ _last ]; int i; for(i = 0; i <= _last - 1; i++){ if( values[ i ] != val ) tmp[ i ] = values[ i + 1 ]; else tmp[ i ] = values[ i + 1 ]; } _last -= 1; delete[] values; values = tmp; }Die Ausgabe ansich funktioniert soweit, in meinem Beispiel hab ich versucht die 2 zu löschen, beim ausgeben der Zahlen kam dann aber die 3 doppelt vor, ich find aber einfach nicht den Logikfehler
-
So geht's:
void ExtListe::erase( int val ) { int *tmp = new int[ _last ]; int iDst = 0; // Zielindex for( int iSrc = 0; iSrc < _last; ++iSrc ) // über die Quelle laufen { if( values[ iSrc ] != val ) tmp[ iDst++ ] = values[ iSrc ]; // nur kopieren und inkrementieren, wenn ungleich } _last = iDst; // Zielindex ist jetzt neues Ende delete[] values; values = tmp; }ansonsten sei Dir std::vector< int > und der Algorithmus std::remove(...) wärmstens empfohlen.
Gruß
Werner
-
Hi!
if( values[ i ] != val ) tmp[ i ] = values[ i + 1 ]; else tmp[ i ] = values[ i + 1 ];Obige Zeilen bedeuten das gleiche wie:
tmp[i] = values[i+1];also egal, ob values[ i ] != val oder ob values[ i ] == val ist.
Pack das Zeugs doch in einen Vector oder ne List, die Elemente lassen sich dann comfortabel löschen, hinzufügen, etc..
-
Vielen Dank,
klar mit Vector ginge alles besser, aber es geht mir ums lernen und in der Prüfung wollen die keine STL sehen

-
Ok, verständlich.
Hier eine Anregung:// Löscht die Zahl num aus dem int-Array arr, das n Elemente hat und // gibt ein neues Array zurück. // n bekommt die (eventuell neue) Größe es Arrays. int* search_and_delete ( int* arr, int &n, int num ) { int i = 0, j = 0; while ( i < n ) { if ( arr[i] != num ) arr[j++] = arr[i]; i++; } n = j; // j hat die Anzahl der Elemente, die != num sind. return (int*)realloc (arr, n * sizeof(int)); } void show ( int* arr, int n ) { int i=0; if ( arr == NULL ) { cout << "Empty array." << endl; return; } cout << "Showing int array with " << n << " elements." << endl; while(i<n) cout << arr[i++] << endl; cout << endl; } int main() { int n = 10; int* a = new int [n]; for ( int i=0; i<n; i++ ) a[i] = i; show (a, n); search_and_delete (a, n, 3); show (a, n); return 0; }
-
Vielen Dank

-
logik0r schrieb:
return (int*)realloc (arr, n * sizeof(int));Ganz fest böse!
reallocNIE in Verbindung mitnewunddeleteverwenden. Überhaupt vorsichtig sein damit, da es nur mit PODs richtig funktioniert.
-
hm aber auch nicht so gut wegen c/c++ mix?
-
Achjah, da war mal was...nagut, dann nimm malloc

-
logik0r schrieb:
Achjah, da war mal was...nagut, dann nimm malloc

Nein, mach auch das nicht. In den meisten Fällen besteht unter C++ kein Grund, auf die C-Speicherverwaltung zurückzugreifen.
Gerade für Anfänger sind die C-Funktionen auch noch schwieriger zu bedienen und entsprechend fehleranfälliger (man muss zum Beispiel
sizeofverwenden und casten). Als nächstes gibt es Probleme, wenn man mit Non-POD-Klassentypen arbeitet, da Konstruktoren und Destruktoren ignoriert werden. Dieser unnötige Aufwand lohnt sich einfach nicht, gerade weil man überhaupt keinen Gewinn durchmalloc()& Co. hat.