2012-04-06 71 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") ; 

}