c++ - teclado - porque se borra lo que escribo
borrar mientras se itera (2)
Posibles duplicados:
Vector.erase (Iterator) causa mal acceso a la memoria
iterar vector, eliminar ciertos elementos a medida que avanzo.
Hola, escribí esto, pero recibo algunos errores al ejecutarlo
for (vector< vector<Point> >::iterator track = tracks_.begin(); track != tracks_.end(); track++) {
if (track->empty()) { // if track is empty, remove it
tracks_.erase(track);
track++; // is this ok?
}else { //if there are points, deque
track->erase(track->begin()); //my program crashes here after a while... ;(
}
}
Tengo un vector de vector de puntos (2 ints) cuyas pistas invoco (1 pista es 1 vector de puntos) Quiero verificar cada pista y si contienen puntos, elimine la primera, de lo contrario borre la pista. ¿Es esto correcto?
Gracias por adelantado.
No estoy seguro de los errores que está recibiendo, pero es probable que esté invalidando su iterador.
Deberías leer http://www.angelikalanger.com/Conferences/Slides/CppInvalidIterators-DevConnections-2002.pdf
Específicamente, vector::erase
invalida todo el iterador y las referencias a los elementos después de la posición o primero.
El erase()
un vector erase()
invalida los iteradores existentes, pero devuelve un nuevo iterador que apunta al elemento después del que se eliminó. Este iterador devuelto se puede usar para continuar iterando sobre el vector.
Su ciclo podría escribirse así:
vector< vector<Point> >::iterator track = tracks_.begin();
while (track != tracks_.end()) {
if (track->empty()) {
// if track is empty, remove it
track = tracks_.erase(track);
}
else {
//if there are points, deque
track->erase(track->begin());
++track;
}
}