2015-01-11 89 views
0

我試圖刪除映射中的所有條目,其中value == 50的任意鍵。刪除STL地圖中的所有條目相匹配值

此代碼爲我工作的罰款。

while (itr != mymap.end()) 
{ 
    if ((*itr).second == 50) 
     mymap.erase(itr++); 
    else 
     itr++; 

} 

但是這段代碼給出了運行時錯誤。

while (itr != mymap.end()) 
{ 
    if ((*itr).second == 50) 
    {  
     mymap.erase(itr); 
     itr++ 
    } 
    else 
     itr++; 

} 

我懷疑是不是兩個邏輯都是一樣的?爲什麼在第二種情況下運行時錯誤?

+2

在第二種情況下,你要增加一個無效的迭代器(因爲你剛刪除它指向的項目)。考慮使用[erase/remove idiom](http://stackoverflow.com/questions/1038708/erase-remove-contents-from-the-map-or-any-other-stl-container-while-iterating) – Borgleader

+0

什麼是在第一種情況下發生?同樣,刪除和增加?對? –

+0

沒有,增量首先發生,但它++返回原始值(不像++),這樣您刪除正確的項目,但迭代器已經指向下一個。 – Borgleader

回答

2

沒有,邏輯是不一樣的。 在第一種情況下,當迭代器是一個有效的迭代器時,在刪除元素之前,該迭代器是postincremented的。 在第二種情況下,當迭代器是無效迭代器時,在刪除元素之後,該迭代器被postincreated。

的常用方法本操作如下

while (itr != mymap.end()) 
{ 
    if ((*itr).second == 50) 
     itr = mymap.erase(itr); 
    else 
     itr++; 
} 

根據C++標準(23.2.4關聯容器)

9所述的插入件和佈設成員不應影響的有效性 迭代器和對容器的引用,以及擦除成員 將僅使迭代器和對已擦除的 元素的引用無效。