2012-04-06 20 views
32

Me gustaría eliminar una clave de un mapa STL. Sin embargo, map.erase() no hace nada. ¿Cómo voy a hacer estoEliminar una clave de un mapa C++

+11

El borrado hace algo. ¿Cómo lo estás utilizando? ¿Y qué te hace creer que no está haciendo nada? –

+1

map.erase (clave). –

+3

¿Y a mi segunda pregunta? –

Respuesta

50

Depende enteramente de cómo lo llame pero parece que puede estar utilizando la opción first,last. Si es así, debe tener en cuenta que borrará elementos comenzando en first, hasta excluyendolast. Siempre que siga esa regla, la eliminación basada en iteradores debería funcionar bien, ya sea como un elemento único o como un rango.

Si está borrando por clave, entonces también debería funcionar, asumiendo que la clave está allí por supuesto.

El siguiente código de ejemplo muestra los tres métodos de acción:

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

que da salida:

c => C 
d => D 
+0

Me siento tan tonto por perder la anulación de 'const key_type &'. ¡Gracias por mencionarlo! –

4

que tendría que encontrar el iterador primera

map.erase(ITERATOR) ; 

Para hacer esto seguro, debe asegurarse de que ITERAT O existe, sin embargo. Ejemplo de par:

#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") ; 

} 
Cuestiones relacionadas