Einzelne Elemente aus Vector löschen
-
Hallo,
ich habe ein Vector mit Zahlen. aus diesem möchte ich nun alle geraden zahlen löschen. Folgenden Algorithmus habe ich dafür.
... vector<int> vec; for(int i = 1; i< 20; i++) vec.push_back(i); vector<int>::iterator it; for ( it = vec.begin() ; it!=vec.end() ; ) { if ( (*it)%2 == 0 ) { vector<int>::iterator pos = remove(vec.begin(), vec.end(), *it); vec.erase(pos,vec.end()); } } ...Wieso aber stürzt er mir ab?
-
WTF machst du da?
Formatier es mal richtig und schreib als Kommentar hinter oder vor jede Zeile was du meinst was sie tut.
Wenn du die Befehle verstehst, solltest du deinen Fehler schon selbst erkennen.
-
Um die "Befehle" (die eigentlich Funktionen sind) zu verstehen, kannst du hier nachschauen. Diese Referenz ist sowieso zu empfehlen.
-
Das remove ist völlig überflüssig.
Mach einfach erase auf den aktuellen iterator und speichere den Rückgabewert als neue Position. Wenn Bedingung fehlschlägt, erhöst du den Iterator ganz einfach.
-
Fellhuhn schrieb:
WTF machst du da?...

Naja, also sooooo schwer zu verstehen ist der Code nun auch nicht.
... und dass bestimmte Iteratoren bestimmter Container nach Schreibzugriffen ungültig werden, ist auch nicht jedem klar.Allerdings braucht man nicht immer wieder das Rad neu erfinden:
struct even { bool operator(int i) { return !(i%2); } }; vector<int> vec; for(int i = 1; i< 20; i++) vec.push_back(i); // Hintergrund: remove...() verschiebt die zu löschenden Elemente nur ans Ende und liefert einen Iterator auf den Anfang dieses Bereichs zurück ... // ... erase() löscht wirklich erase( remove_if(vec.begin(), vec.end(), even), vec.end());(ungetestet)
Gruß,
Simon2.
-
std::listwäre besser geeignet.