Statisches array schrumpfen lassen
-
Hallo,
ich brauche eine Methode um aus einem Array alle 0-elemente zu löschen, d.h ein neues array zu erzeugen welches aus nur nicht-NUll einträgen besteht im gegensatzt zum ausgangsarray.Jetzt kann ich mir aber nur vorstellen dass ich insgesamt 2 mal über das ausgangsarray laufen muss. Einmal um die anzahl der nicht-null einträge zu bestimmen um dann das neue array alloziieren zu können und einmal um dann das array zu füllen mit den nicht-null einträgen.
Sehe ich das richtig das ich mit "normalen" arrays (also keine vectoren oder listen) hier wirklich 2 Läufe brauche?
-
Nicht unbedingt. Das Zielarray kann sowieso nur ein dynamisches Array sein, wenn dessen Grösse Element genau angepasst werden soll. Und da reicht ein Durchlauf aus, sofern der Container über eine entsprechende resize Funktion verfügt.
Ansonsten, man kann ja auch das Ausgangsarray als Zielarray verwenden. Zwar sind dann einige Einträge am Ende ungenutzt, da es sich aber um ein statisches Array handelt, kann es sowieso nicht in der Grösse werden.
-
int main () { char arr[] = {0, 7, 9, 4, 0, 3, 4, 0, 1}; char* lesen = arr; char* schreiben = arr; int newlen = 0; for (int len = sizeof arr; len; lesen++, len--) { if (*lesen != 0) schreiben[newlen++] = *lesen; } return 0; }
-
noob33 schrieb:
int main () { char arr[] = {0, 7, 9, 4, 0, 3, 4, 0, 1}; char* lesen = arr; char* schreiben = arr; int newlen = 0; for (int len = sizeof arr; len; lesen++, len--) { if (*lesen != 0) schreiben[newlen++] = *lesen; } return 0; }oder auch
#include <algorithm> int main() { char arr[] = {0, 7, 9, 4, 0, 3, 4, 0, 1}; int newlen = std::remove( arr, arr + sizeof arr, 0 ) - arr; return 0; }
-
danke damit gibt es natürlich am ende ungenutzte einträge.
Wie kann ich denn aber im nachhinein jetzt NUR die genutzen einträge auch bekommen? weil die länge des array ist ja grösser als die der genutzten einträge...
-
char* b = new char[newlen]; memcpy(b, arr, (size_t)newlen);