web-dev-qa-db-de.com

Entfernen Sie einen Schlüssel aus einer C ++ - Map

Ich möchte einen Schlüssel von einer STL-Karte entfernen. map.erase() macht jedoch nichts. Wie würde ich das machen?

44
Steffan Harris

Es hängt ganz davon ab, wie Sie es nennen, aber es klingt, als ob Sie das first,last Möglichkeit. In diesem Fall müssen Sie berücksichtigen, dass Elemente gelöscht werden, die mit first bis zu ohnelast beginnen. Vorausgesetzt, Sie befolgen diese Regel, sollte das iteratorbasierte Entfernen problemlos funktionieren, entweder als einzelnes Element oder als Bereich.

Wenn Sie mit dem Schlüssel löschen, sollte dies auch funktionieren, vorausgesetzt, der Schlüssel ist vorhanden.

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;
}

welche Ausgänge:

c => C
d => D
72
paxdiablo

Sie müssten finde den Iterator zuerst

map.erase( ITERATOR ) ;

Um dies sicher zu machen, müssen Sie jedoch sicherstellen, dass ITERATOR vorhanden ist. Gleiches 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" ) ;

}
8
bobobobo