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.