löschen von teilen eines vektors
-
HALLO.
kann sich mal bitte jemand folgenden code anschauen? es geht darum, alle einsen aus dem vektor zu löschen, so dass am ende nur noch die 4 NULLEN übrig bleiben. leider kann ich meinen fehler nicht finden.

#include <conio.h> #include <vector> #include <algorithm> using namespace std; int main() { int i; vector<int> POINT; POINT.push_back(1); POINT.push_back(1); POINT.push_back(0); POINT.push_back(0); POINT.push_back(0); POINT.push_back(0); POINT.push_back(1); POINT.push_back(1); for (i=0;i<POINT.size();i++) { if (POINT[i]==1) { vector<int>::iterator platz = remove(POINT.begin()+i, POINT.end()+i,POINT[i]); POINT.erase(platz); i--; } } return 0; }VIELEN DANK.
STICK.
-
Und was ist dein Fehler? Bei mir funktioniert dein Programm
-
wie jetzt? du hast am ende nur noch 4 NULLEN stehen, und die EINSEN sind alle gelöscht? bei mir sind am ende nämlich nur noch 2 NULLEN da!
-
Oh, sorry da hab ich mich verschaut. Hab nicht aufgepasst das es 4 Nullen sind. Nein dann funktioniert es bei mir auch nicht, hab nur 2 Nullen übrig.
-
da sind viele fehler drin...
wie wärs denn mit
POINT.erase(remove(POINT.begin(),POINT.end(),1),POINT.end());
-
danke, so funktioniert das schon einmal. aber nun würde ich gerne die einsen nicht alle auf einmal löschen, sondern in einer for-schleife alle nacheinander. geht das irgendwie?
leider hast du auch nicht gesagt, was konkret FALSCH ist. so habe ich das nächste mal auch keine ahnung, was nicht funktionieren kann

DANKE.
STICK.
-
remove(POINT.begin()+i, POINT.end()+i,POINT[i])Du sagst deinem Vektor hier: lösche von begin + i bis zum Ende alle Elemente, welchen den Wert POINT[i] haben. Erstens wenn du die einsen raus haben musst, muss da auch die 1 stehen. Danach bekommst du einen Iterator auf die Stelle im Feld, wo es jetzt theoretisch zu Ende ist. Praktisch wird kein Element gelöscht. Deine einsen stehen dann nur am Ende des Feldes.
Schaue dir mal den remove-Algorithmus genau an.Zweitens benutzt man ja remove, um gerade selber keine Schleife schreiben zu müssen. Wenn du das also "per Hand" machen willst, ist remove eher ungünstig.
vector<int>::iterator it = POINT.begin(); while(it != POINT.end()) { if(*it == 1) { it = POINT.erase(it); } else { ++it; } }
-
@ PELLAEON:
danke für die antwort. meine remove-anweisung war wirklich etwas unüberlegt, will ich mal sagen. habe es inzwischen zwar selber gelöst, deine vorgeschlagene variante sieht aber durchaus eleganter aus!
DANKE.
สทิ้ก