2015-12-02 50 views
-1

我有一個包含以下鍵值對的映射。 (d,S),...(g,Z)} {(a,P),(b,Q),(c,R),(d,S),...(g,Z)}我迭代這個映射,採取一個分支訪問這個相同的地圖,並在滿足條件時擦除地圖的一個元素。 簡而言之,當主迭代器在(b.Q)時,分支函數可能會擦除(d,S)。在迭代時擦除std :: map的其他元素

這是否有效?或者將這個seg錯誤。?

+2

http://stackoverflow.com/questions/263945/what-happens-if-you-call-erase-on-a-map-element-while-iterating-from-begin-to?rq=1 –

+0

也許你應該發佈[MVCE](http://stackoverflow.com/help/mcve)。 – erip

回答

4

你需要閱讀迭代器失效規則:

std::map::erase

引用和迭代器擦除元素無效。其他 引用和迭代器不受影響。

所以只要你不使用你擦除的迭代器,你是好的。

+0

那麼當主函數「達到」(d,S)時它會被刪除? –

+1

擦除元素後(例如(d,S)),該元素不再是容器的一部分。你將永遠不會通過迭代容器來達到它。 CARE:如果你在擦除之前獲得了(d,S)的迭代器,那麼迭代器將失效,所以你不能再使用它了。 – bolov

+0

但它表示失效不會發生在C++ 03中。而且我確實遇到了「Double Free或Corruption」的seg故障 –