std :: vector iterator invalidation
Zu diesem Thema wurden bereits einige Fragen gestellt. Mein Verständnis ist, dass das Aufrufen vonstd::vector::erase
macht nur Iteratoren ungültig, die sich an einer Position befindennac das gelöschte Element. Ist jedoch nach dem Löschen eines Elements der Iterator an dieser Position noch gültig (vorausgesetzt natürlich, dass er nicht auf @ zeigtend()
nach dem Löschen)?
ein Verständnis, wie ein Vektor implementiert werden würde, scheint darauf hinzudeuten, dass der Iterator definitiv verwendbar ist, aber ich bin nicht ganz sicher, ob er zu undefiniertem Verhalten führen könnt
Als Beispiel für das, wovon ich spreche, entfernt der folgende Code alle ungeraden Ganzzahlen aus einem Vektor. Verursacht dieser Code undefiniertes Verhalten?
typedef std::vector<int> vectype;
vectype vec;
for (int i = 0; i < 100; ++i) vec.push_back(i);
vectype::iterator it = vec.begin();
while (it != vec.end()) {
if (*it % 2 == 1) vec.erase(it);
else ++it;
}
Der Code läuft gut auf meinem Computer, aber das überzeugt mich nicht, dass er gültig ist.