[c++] vector elemente löschen

Aiju

Gesperrt
Wie kann ich std::vector Elemente ohne invalid pointer Fehler löschen :)
Entschuldigt den kurzen Beitrag
 
Matthias Reitinger hat gesagt.:
Wie wäre es mit der Methode erase?

Entschuldige die kurze Antwort ;)
Das probiere ich ja schon:
Code:
vector<SFlag*>::iterator it=flags.begin();
for(int i=0;i<j;i++) // Element j löschen
 it++;
flags.erase(it);
So ähnlich habe ichs, doch es kommt:
Code:
glibc detected: invalid pointer 0xXXXXXXX
 
Hi.

Um Element i zu löschen, brauchst du den iterator nicht in einer Schleife i-mal weiter setzen, du kannst einfach it += i; setzen.

Möchtest du nur ein Element löschen oder mehrere? Der Iterator wird ungültig wenn du eine modifizierende Operation auf dem Vektor ausführst, d.h. du mußt dir dann einen neuen Iterator besorgen wenn du ein Element gelöscht hast.

Gruß
 
Ok, ich habe es so:
Code:
  vector<SFlag*>::iterator it = flags.begin();
  for(int i=0;i<flags.size();i++)
  {
   it++;
   if((robot.x == flags[i]->x) && (robot.y == flags[i]->y))
   {
    flags.erase(it);
    break;
   }
  }
 
Zuletzt bearbeitet:
Das Problem ist, das du den Iterator erhöhst wenn du die Schleife betrittst. Das heißt dein Index i ist immer eins kleiner als der Index des Elementes auf den der Iterator zeigt wenn der Vergleich gemacht wird.

Ich würde es z.B. einfach so machen (ohne den STL Algorithmus find_if zu benutzen):
Code:
vector<SFlag*>::iterator it = flags.begin();
while (it != flags.end()) {
  if (it->x == robot.x && it->y == robot.y) {
    flags.erase(it); break;
  }
  ++it; /* Hatte ich doch glatt vergessen ...  */
}

Gruß
 
Zuletzt bearbeitet:
Aiju hat gesagt.:
Wo liegt denn überhaupt der Unterschied zwischen it++ und ++it?
Oh je. :( Wäre evtl. nicht verkehrt wenn du dir erstmal die Grundlagen anschaust.

Das eine ist ein Präinkrementoperator, das andere ein Postinkrementoperator. Es gibt nur einen Unterschied wenn man die Rückgabewerte der beiden Operatoren benutzt. (also für den erase Code völlig unwichtig)

Bsp:
Code:
int x = 5;
int pre = ++x; 
int post  = x++;
Frage: Was ist der Wert von pre, was ist der Wert von post? Das gleiche Prinzip gilt natürlich auch bei den Iteratoren.

Gruß
 
pre = 6
post = 6
Siehe JavaScript für Kids
Code:
var a=3,b=4,c=5;
(a++ + ++b) * (--c - a);
(ist in c anscheinend auch so)
 
Ja, stimmt. :)

Allerdings ist nicht definiert was das Ergebnis der Anweisung in C/C++ ist da die Anweisung "undefiniertes Verhalten" auslöst. Bei den meisten Compilern wird allerdings 0 oder 8 herauskommen.

Gruß
 

Neue Beiträge

Zurück