2012-01-23 9 views
6

¿Es posible caminar de forma consecutiva a través de QMap con la ayuda de iteradores, y hacer tales acciones: eliminar algunos elementos y agregar otros nuevos?¿Es correcto recorrer QMap con iteradores y borrar/agregar elementos?

Por ejemplo:

for(QMap<key_t,val_t>::iterator it = map.begin(); 
    it != map.end(); 
    ++it) 
{ 
    if(it->value == something) 
    { 
      map.erase(it); 
      map.insert(it->key+10,it->value); 
    } 
} 

Parece, que no se hará nada mal, yo estoy pidiendo para estar seguro. (No tengo tiempo suficiente para verificarlo).

UPD resolverá con QMap::unite():

for(QMap<key_t,val_t>::iterator it = map.begin(); 
    it != map.end(); 
    ++it) 
{ 
    if(it->value == something) 
    { 
      tmp_map.insert(it->key+10,it->value); 
      map.erase(it); 
    } 
} 
map.unite(tmp_map); 

Gracias por las respuestas!

Respuesta

4

Piénselo un momento ... Está iterando sobre una colección, eliminando un elemento en el medio y agregando otro en otro lugar. ¿Los iteradores seguirán siendo correctos? ¿El iterador "siguiente" será realmente el siguiente?

En general, no es una buena idea cambiar una colección sobre la que se está iterando. Si es necesario, utilice una colección temporal y copie los elementos seleccionados a eso, borre la colección real y mueva los elementos de la colección temporal a la real.

En su caso, sin embargo, por qué no usar QMap::find para buscar something, y si se encuentra borrado y añadir el nuevo elemento, y hacerlo en un bucle hasta que something no se encuentra más?

+0

Gracias por su útil respuesta! No puedo usar su consejo en la última oración porque debería manipular con el elemento de QMap buscando su valor. Después de borrar e insertar el valor no cambia, entonces puedo operar con los mismos elementos infinitamente. He tenido en cuenta tus consejos para utilizar una colección temporal y resolver el problema con QMap :: unite(). ¡Muchas gracias! – ASten

1

Tienes que "restablecer" tu iterador al que devolvieron erase y insert. Sin embargo, está bien en principio.

2

Yo esperaría it como no válida después de map.erase(it), en cuyo caso it->value y ++it no funcionarán.

13

El iterador se invalidará por erase, por lo que no se puede usar o aumentar de forma segura después. Lo siguiente debería funcionar:

for(QMap<key_t,val_t>::iterator it = map.begin(); it != map.end();) 
{ 
    if(it->value == something) 
    { 
     map.insert(it.key()+10,it.value()); 
     it = map.erase(it); 
    } else { 
     ++it; 
    } 
} 
+0

Siento que esta es la respuesta correcta. –

Cuestiones relacionadas