2010-10-17 21 views
15
#include <map> 

... 

multimap<char,int> first; 

first.insert(pair<char,int>('a',10)); 
first.insert(pair<char,int>('b',15)); 
first.insert(pair<char,int>('b',20)); 
first.insert(pair<char,int>('c',25)); 

Digamos que ahora quiero eliminar uno de los pares que acabo de agregar al mapa.¿Cómo eliminar un par específico de un multimapa en C++?

Tengo ejemplos para eliminar una entrada de clave completa, que para la clave 'b' eliminaría tanto 'b', 15 como 'b', 20.

Pero, ¿cuál es el código para eliminar simplemente, digamos, el par 'b', 20?

Respuesta

27

Puede usar std::multimap<char, int>::equal_range, que le proporcionará un rango de iterador que contiene todos los pares que tienen una determinada clave. Entonces, si busca 'b', obtendrá un rango de iterador que contiene todos los pares que tienen 'b' como la clave.

Puede simplemente iterar sobre el rango y borrar cualquier par que le parezca, borrando el iterador.

multimap<char,int> mymap; 

mymap.insert(pair<char,int>('a',10)); 
mymap.insert(pair<char,int>('b',15)); 
mymap.insert(pair<char,int>('b',20)); 
mymap.insert(pair<char,int>('c',25)); 

typedef multimap<char, int>::iterator iterator; 
std::pair<iterator, iterator> iterpair = mymap.equal_range('b'); 

// Erase (b,15) pair 
// 
iterator it = iterpair.first; 
for (; it != iterpair.second; ++it) { 
    if (it->second == 15) { 
     mymap.erase(it); 
     break; 
    } 
} 
+0

Muchas gracias Charles, y también para el fragmento de código. –

+1

¡Gracias por esto! También tenga en cuenta que puede haber más de un par que tenga el valor Y de la clave correspondiente (por ejemplo, más de un par ('b', 15)), por lo que es posible que no desee romper después de encontrar solo el primer golpe. También tenga en cuenta que con multimap, aparentemente la función erase() no invalida otros iteradores (excepto el iterador borrado), por lo que puede seguir iterando (o al menos eso es lo que recojo de esta página: http: //www.cplusplus .com/reference/map/multimap/erase /) –

+2

Puede seguir iterando sí, pero el iterador borrado es invalidado, por lo que primero debe recuperar un iterador para el próximo elemento. –

Cuestiones relacionadas