2010-01-22 11 views
15

Tengo STL Multimap, quiero eliminar entradas del mapa que tiene un valor específico, no quiero eliminar la clave completa, ya que esa clave puede estar mapeando a otros valores que se requieren.STL Multimap Eliminar/Borrar valores

ayuda por favor.

+1

Una posible solución podría ser la de cambiar las claves y valores , esta podría no ser una opción para todos leyendo esto, pero podría ser para algunos. – dangerousdave

Respuesta

14

Si entiendo correctamente estos valores pueden aparecer bajo cualquier tecla. Si ese es el caso, tendrá que iterar sobre su multimapa y borrar valores específicos.

typedef std::multimap<std::string, int> Multimap; 
Multimap data; 

for (Multimap::iterator iter = data.begin(); iter != data.end();) 
{ 
    // you have to do this because iterators are invalidated 
    Multimap::iterator erase_iter = iter++; 

    // removes all even values 
    if (erase_iter->second % 2 == 0) 
     data.erase(erase_iter); 
} 
+0

Sí, tiene la razón, los valores pueden aparecer debajo de cualquier tecla. – Avinash

+0

Gracias Esto funciona para mí, estaba buscando utilizar los algoritmos remove_if. – Avinash

+0

Me temo que 'remove_if' de' 'solo funciona para contenedores donde es posible reasignar valores (vector, deque, list - excepto suboptimal para el último) haciendo' * it1 = * it2'. Esto no es posible para el mapa, ya que podría romper el orden. – UncleBens

1

Desde C++ 11, std::multimap::erase devuelve un iterador siguiente al último elemento eliminado.

Así puede volver a escribir la respuesta de Nikola poco más limpia sin necesidad de introducir la variable erase_iter locales:

typedef std::multimap<std::string, int> Multimap; 
Multimap data; 

for (Multimap::iterator iter = data.begin(); iter != data.end();) 
{ 
    // removes all even values 
    if (iter->second % 2 == 0) 
     iter = data.erase(iter); 
    else 
     ++iter; 
} 

(Véase también la respuesta a this question)