2012-04-06 72 views
32

我想从STL地图中删除密钥。但是,map.erase()不会执行任何操作。 我该怎么去做这个从C++地图中删除密钥

+11

擦除做些什么。你怎么使用它?什么让你相信它没有做任何事情? – 2012-04-06 04:05:45

+1

map.erase(key)。 – 2012-04-06 04:07:01

+3

对我的第二个问题? – 2012-04-06 04:07:40

回答

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&'的覆盖。感谢您指出! – 2016-07-08 20:56:22

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

}