c++ - shift-array-Elemente nach Links
Ich habe erst seit kurzem C++ und habe Schwierigkeiten beim verschieben von array-Elementen zu entfernen, leer/null-Elemente
char *aBlock;
aBlock = new char[100];
int main(int argc, char **argv)
{
aBlock[20] = 'a'; //fill array with test data.
aBlock[10] = 's';
aBlock[30] = 'd'; //Excepted output: This test data should be shifted to the start of array
//Consider aBlock contains data, with random empty elements
for(int i=1; i <= aBlock.length(); i++) {
if(aBlock[i-1] == 0) {
aBlock[i-1] = aBlock[i];
aBlock[i] = 0;
}
}
return 0;
}
Bearbeiten:
Fixed-code, Tippfehler & falschen Variablen Namen geändert "==" zu "=".
Es funktioniert immer noch nicht wie erwartet.
- Ein Hinweis zur Terminologie: ein array kann nicht "leer" - Elementen. In Ihrem Fall scheinen Sie zu wollen, zum entfernen von Elementen mit Wert
== 0
. - Was ist
.length()
einen Zeiger auf den ersten Platz? - Angesichts der oben genannten code, würde ich sagen, eineblockieren[50] leer wie nichts zugewiesen wurde. Was wäre die richtige Terminologie, um zu beschreiben, Ihren Zustand?
- "Voll". Auch wenn nichts zugeteilt worden war, gibt es Werte in jedem array-position. Wenn Sie wollen, zu zählen, wie viele Werte zugewiesen werden, Sie müssen eine separate count-variable
- Es hat einen Wert, der
== 0
, das ist alles. Es ist einchar
es, so ist es nicht "leer", und0
ist ein Gültiger Wert für einechar
(in der Regel die wörtliche\0
verwendet wird.) - Auch ein wichtiger Hinweis: das array ist null-initialisiert, weil es global ist. Aber wenn es definiert wurden innerhalb von
main
oder eine andere Funktion, es wäre nicht, so würden Sie brauchen, um zu definieren es wie folgt:aBlock = new char[100]();
. - Haben Sie schon mal versucht, den code zu kompilieren? Dieses funktioniert überhaupt nicht. Ein Zeiger in C++ nicht über eine
length()
Mitglied und die variablememBlock
wird nie erklärt. - Wie erwarten Sie, dass code, der nicht kompiliert zu "arbeiten"?
- Ich denke was er versucht zu tun ist, verdichten des array, obwohl er durchaus eine lange Wege Weg von funktionierenden code, ja 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich das richtig verstanden, Sie wollen zu bewegen, die nicht-null-Elemente am Anfang von array. Könnten Sie
std::remove_if
dies zu tun, und legen Sie die übrigen Elemente auf 0.UPDATE:
Da das array dynamisch allokiert müssen Sie eine kleine änderung:
std::end
wird nicht funktionieren, da das array dynamisch reserviert. Es wäre auch einfacher zu verwendenstd::remove
in diesem Fall.begin
undend
. Aber man könnte&aBlock[0]
und&aBlock[100]
.remove_if
überremove
. Es scheint wie eine unnötige Komplikation.no matching function for call to ‘remove_if(char*, char*, MemManager::Compact()::__lambda0)’
std::remove(aBlock, aBlock + 100, '\0')
.remove_if
mitremove
wie vorgeschlagen von @juanchopanza Ty!Betreiber
==
überprüft die Gleichheit, die Sie verwenden müssen=
zuweisen.Arrays in C++ nicht jedes Mitglied wie
.length()
. Sie sind nicht Klassen.Wenn Sie wissen, die Größe zur compile-Zeit, die Verwendung von std::array, wenn verfügbar. Dann können Sie tun ".size()" 🙂 Außerdem ist der code nicht funktioniert, wenn Sie mehrere aufeinander folgende Nullen. Jedes element wird nach Links verschoben höchstens einmal, und das ist eindeutig unzureichend, um die Erreichung Ihrer gewünschten Ergebnis. Was Sie tun müssen, ist zu verfolgen, einen separaten "Ausgang" index/iterator, der erhält alle nicht-null-Wert, der Sie begegnen und der ist dann erhöht:
Sollte den trick tun.
Randnotiz: neu im globalen Raum? Und wo ist delete[] ?
ändern
zu
"==" ist das problem, denke ich.
verwenden
length()
auf einechar*
zum Beispiel. Der code wird nicht kompiliert, auf alle.