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

Angenommen, ich möchte jetzt eines der Paare entfernen, die ich gerade zur Karte hinzugefügt habe.Wie entfernt man ein bestimmtes Paar aus einer C++ - Multimap?

Ich habe Beispiele, um einen vollständigen Schlüsseleintrag zu entfernen, der für Schlüssel 'b' würde sowohl 'b', 15 und 'b', 20 entfernen.

Aber was ist der Code nur zu entfernen, sagen wir, das Paar 'b', 20?

Antwort

27

Sie können std::multimap<char, int>::equal_range verwenden, was Ihnen einen Iteratorbereich mit allen Paaren gibt, die einen bestimmten Schlüssel haben. Wenn Sie also nach 'b' suchen, erhalten Sie einen Iterator-Bereich mit allen Paaren, die 'b' als Schlüssel haben.

Sie können dann einfach über den Bereich iterieren und jedes Paar löschen, das Ihnen passt, indem Sie den Iterator löschen.

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

Vielen Dank Charles, und auch für das Code-Snippet. –

+1

Danke dafür! Beachten Sie auch, dass es mehr als ein Paar geben kann, das über einen übereinstimmenden AND-Schlüssel verfügt (z. B. mehr als ein ('b', 15) -Paar), sodass Sie nach dem Auffinden des ersten Treffers nicht mehr abbrechen möchten. Beachten Sie auch, dass bei multimap anscheinend die radier() -Funktion andere Iteratoren (außer dem gelöschten Iterator) nicht ungültig macht, so dass Sie weiter iterieren können (oder zumindest das, was ich von dieser Seite erhalte: http: //www.cplusplus .com/reference/map/multimap/erase /) –

+2

Sie können weiter iterieren, aber der tatsächlich gelöschte Iterator wird ungültig, so dass Sie zuerst einen Iterator für das nächste Element abrufen müssen. –