2012-04-06 2 views
32

Я хотел бы удалить ключ с карты STL. Однако map.erase() ничего не делает. Как бы я это сделалУдалить ключ с карты C++

+11

Erase делает что-то. Как вы его используете? И что заставляет вас поверить, что ничего не делает? –

+1

map.erase (ключ). –

+3

И к моему второму вопросу? –

ответ

50

Это зависит полностью от того, как вы его вызываете, но похоже, что вы можете использовать опцию first,last. Если вы хотите, вы должны помнить, что он стирает элементы, начиная с first, но до исключаяlast. Если вы следуете этому правилу, удаление на основе итератора должно работать нормально, либо как отдельный элемент, либо диапазон.

Если вы стираете ключ, тогда он также должен работать, если, конечно, ключ находится там.

Следующий пример кода показывает все три метода в действии:

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

, который выводит:

c => C 
d => D 
+0

Я чувствую себя настолько тупым, что не заметил переопределения для 'const key_type &'. Спасибо, что указали! –

4

Вы должны найти Итератор первого

map.erase(ITERATOR) ; 

Для сделайте это безопасным, вам нужно убедиться, что ITERAT ИЛИ существует, однако. Примерный пример:

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

} 
Смежные вопросы