2012-05-09 40 views
3

可能重複:
How to filter items from a std::map?
What happens if you call erase() on a map element while iterating from begin to end?當我從地圖中刪除條目時,map :: iterator會發生什麼?

我有對象的地圖,我想遍歷並刪除某些條目。

typedef std::map<A,B> MapT; 
MapT m; 
MapT::iterator it; 

for(it = m.begin(); it != m.end(); it++) { 
    if(condition) m.erase(it); 
} 

我可以這樣做嗎?

+0

迭代器都將失效。 – Joe

+1

什麼是MapT? – Nawaz

+0

它是'std :: map ':) – kravemir

回答

8

如果std::map迭代器和對擦除元素的引用無效[23.1.2/8]。您的代碼在之後使用迭代器已被無效,這會導致未定義的行爲。爲了避免這種未定義的行爲,迭代器需要在之前遞增,在erase()調用中它會失效。

您需要使用:

for(it = m.begin(); it != m.end();) { 
    if(condition) 
     m.erase(it++); 
    else 
     ++it; 
} 

注意的是,這裏it++增量it,以便它指的是下一個元素,但得到其原始值的副本。因此,it不引用調用erase()時刪除的元素。

2

假設MapTstd::map,那麼迭代器在擦除時將失效。 (在一個循環erase)做到這一點,正確的方法是迭代和增量緩存清除它之前:一旦你修改地圖

MapT m; 
MapT::iterator it; 

for(it = m.begin(); it != m.end();) 
{ 
    if(condition) 
    { 
     MapT::iterator tmp = it++; 
     m.erase(tmp); 
    } 
    else 
    { 
     ++it; 
    } 
} 
相關問題