2012-04-06 15 views
32

Ich möchte einen Schlüssel aus einer STL-Karte entfernen. map.erase() tut jedoch nichts. Wie würde ich dabei vorgehen?Entfernen Sie einen Schlüssel aus einer C++ - Karte

+11

Löschen tut etwas. Wie benutzt du es? Und was lässt dich glauben, dass es nichts tut? –

+1

map.serase (Schlüssel). –

+3

Und zu meiner zweiten Frage? –

Antwort

50

Es hängt ganz davon ab, wie Sie es nennen, aber es klingt wie Sie möglicherweise die first,last Option verwenden. Wenn Sie es sind, müssen Sie daran denken, dass es Elemente beginnend bei first, aber bis außerlast löscht. Wenn Sie dieser Regel folgen, sollte die iteratorbasierte Entfernung entweder als einzelnes Element oder als Bereich funktionieren.

Wenn Sie mit dem Schlüssel löschen, sollte es auch funktionieren, vorausgesetzt, der Schlüssel ist dort natürlich.

Der folgende Beispielcode zeigt alle drei Methoden in Aktion:

#include <iostream> 
#include <map> 

int main (void) { 
    std::map<char,char> mymap; 
    std::map<char,char>::iterator it; 

    mymap['a'] = 'A'; mymap['b'] = 'B'; mymap['c'] = 'C'; 
    mymap['d'] = 'D'; mymap['e'] = 'E'; mymap['f'] = 'F'; 
    mymap['g'] = 'G'; mymap['h'] = 'H'; mymap['i'] = 'I'; 

    it = mymap.find ('b');    // by iterator (b), leaves acdefghi. 
    mymap.erase (it); 

    it = mymap.find ('e');    // by range (e-i), leaves acd. 
    mymap.erase (it, mymap.end()); 

    mymap.erase ('a');     // by key (a), leaves cd. 

    mymap.erase ('z');     // invalid key (none), leaves cd. 

    for (it = mymap.begin(); it != mymap.end(); it++) 
     std::cout << (*it).first << " => " << (*it).second << '\n'; 

    return 0; 
} 

die Ausgänge:

c => C 
d => D 
+0

Ich fühle mich so dumm, wenn ich den Override für 'const key_type &' vermisse. Danke für das Aufzeigen! –

4

Sie zu haben würde, um den Iterator erste

map.erase(ITERATOR) ; 

finden Machen Sie das sicher, Sie müssen sicherstellen, dass ITERAT ODER existiert jedoch. Beispiel:

#include <stdio.h> 
#include <map> 
using namespace std ; 

int main() 
{ 
    map<int,int> m ; 
    m.insert(make_pair(1,1)) ; 
    map<int,int>::iterator iter = m.find(1) ; 
    if(iter != m.end()) 
    m.erase(iter); 
    else puts("not found") ; 

} 
Verwandte Themen