2011-06-05 9 views
5

tengo un mapa que está definido en la memoria global. estoy iterando sobre eso, digamos que estoy en el tercer elemento. ahora estoy llamando a otra función que genera su propio iterador sobre el mismo mapa, sin embargo, podría borrar los elementos 4º o 5º ... en el mapa. mi pregunta es, cuando regreso de esa función y sigo iterando sobre el mapa (le recuerdo que estoy en el tercer elemento), ¿puede mi iterador ser inválido o seguro?iterar sobre un mapa y llamar a una función que borre otros elementos es el mapa

lo siento, no puedo adjuntar el código, es muy, muy largo.

gracias

EDIT: mi pregunta es algo como esto:

map<string,string> mapi; 

void er() { 
    mapi.erase("t"); 
} 

int main() { 


mapi.insert(pair<string,string>("w","a")); 
mapi.insert(pair<string,string>("e","a")); 
mapi.insert(pair<string,string>("r","a")); 
mapi.insert(pair<string,string>("t","a")); 
mapi.insert(pair<string,string>("A","a")); 
mapi.insert(pair<string,string>("u","a")); 
mapi.insert(pair<string,string>("C","a")); 

map<string,string>::iterator it; 
for (it=mapi.begin(); it!=mapi.end(); it++) { 
    cout << it->first << endl; 
    if (it->first=="t") 
     er(); 
} 

}

en este caso borro el mismo elemento - valgrind dice que su error. sin embargo, cuando elimino otros elementos, parece que funciona bien.

+0

Cree un caso de uso simple y pruébelo. – Xeo

+0

@ Xeo: Eso no * garantizaría * que sea seguro y definido. –

+0

he creado algo muy simple. parece funcionar, sin embargo, solo quiero la opinión de los demás, solo para estar seguro –

Respuesta

7

De http://www.sgi.com/tech/stl/Map.html:

Borrado de un elemento de un mapa También no invalida cualquier iteradores, excepto, por supuesto, para los iteradores que realidad apuntan al elemento que es se borren.

+0

Si borra el elemento actual, el valor de retorno le da un nuevo iterador válido para continuar (en lugar de incrementar el iterador invalidado que proporciona un comportamiento indefinido). A veces es posible reorganizar el ciclo para hacer uso de esto. –

+2

erase() en el mapa no es válido. no se devuelve ningún iterador –

+0

@rob Tienes razón; Estaba pensando en los requisitos de secuencia. Para el mapa 'm.erase (i ++)' puede hacer el truco (uno de los pocos usos útiles para el incremento posterior). –

Cuestiones relacionadas