2010-10-17 2 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)); 

Dire che ora voglio rimuovere una delle coppie che ho appena aggiunto alla mappa.Come rimuovere una coppia specifica da un multimap C++?

Ho esempi per rimuovere un'intera voce di chiave, che per la chiave "b" rimuove sia "b", 15 e "b", 20.

Ma qual è il codice da rimuovere solo, ad esempio, la coppia 'b', 20?

risposta

27

È possibile utilizzare std::multimap<char, int>::equal_range, che fornirà un intervallo di iteratore contenente tutte le coppie che hanno un determinato tasto. Quindi se cerchi 'b', otterrai un intervallo di iteratore contenente tutte le coppie che hanno 'b' come chiave.

È quindi possibile scorrere semplicemente l'intervallo e cancellare qualsiasi coppia ritenuta appropriata, cancellando l'iteratore.

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

Grazie mille Charles e anche per lo snippet di codice. –

+1

Grazie per questo! Si noti inoltre che può esserci più di una coppia che ha il valore AND della chiave corrispondente (ad esempio più di una coppia ('b', 15)), quindi potresti non voler rompere dopo aver trovato solo il primo hit. Nota che con multimap, apparentemente la funzione cancella() non invalida altri iteratori (eccetto l'iteratore cancellato), quindi puoi continuare a scorrere (o almeno questo è ciò che raccolgo da questa pagina: http: //www.cplusplus .com/reference/map/multimap/cancella /) –

+2

Si può continuare con iterazione sì, ma l'iteratore effettivamente cancellato è invalidato, quindi è necessario prima recuperare un iteratore all'elemento successivo. –