remove index from delete c++ vector erase openframeworks

from - remove index c++



Vector.erase(Iterator) causa mal acceso a la memoria (4)

Cuidado, borrar los elementos uno por uno de un vector tiene una complejidad cuadrática. STL al rescate!

#include <algorithm> #include <functional> videoObjects.erase( std::remove_if( std::bind2nd( std::mem_fun_ref(&videoObject::isInside), ofPoint(tcur.getX(), tcur.getY()) ), ), videoObjects.end() );

Estoy tratando de hacer un reordenamiento Z-Index de videoObjects almacenados en un vector . El plan es identificar el videoObject que se colocará en la primera posición del vector , borrarlo y luego insertarlo en la primera posición. Desafortunadamente, la función de erase() siempre causa un acceso deficiente a la memoria.

Aquí está mi código:

TestApp.h:

vector<videoObject> videoObjects; vector<videoObject>::iterator itVid;

testApp.cpp:

// Get the videoObject which relates to the user event for(itVid = videoObjects.begin(); itVid != videoObjects.end(); ++itVid) { if(videoObjects.at(itVid - videoObjects.begin()).isInside(ofPoint(tcur.getX(), tcur.getY()))) { videoObjects.erase(itVid); } }

Esto debería ser tan simple, pero simplemente no veo hacia dónde estoy tomando el giro equivocado.


Deberías hacer

itVid = videoObjects.erase(itVid);

Cita de cplusplus.com :

[ vector::erase ] invalida todo el iterador y las referencias a los elementos después de la posición o primero .

Valor de retorno: Un iterador de acceso aleatorio que apunta a la nueva ubicación del elemento que siguió al último elemento borrado por la llamada a la función, que es el vector final si la operación borró el último elemento de la secuencia.

Actualización: la forma en que accede al elemento actual dentro de su condición parece bastante extraño. También se debe evitar incrementar el iterador después de erase , ya que esto saltaría un elemento y podría causar errores fuera de límites. Prueba esto:

for(itVid = videoObjects.begin(); itVid != videoObjects.end(); ){ if(itVid->isInside(ofPoint(tcur.getX(), tcur.getY()))){ itVid = videoObjects.erase(itVid); } else { ++itVid; } }


No puede eliminar mientras itera sobre la lista porque el iterador no es válido. Debería usar el iterador de retorno de Erase para establecerlo en su iterador actual.


erase función erase devuelve el siguiente iterador válido.

Tendría que hacer un ciclo while y hacer algo como

iterator = erase(...)

con los controles correspondientes.