C++ 的 STL -在迴圈中刪除 iterator (iterator erase in loop)
在任何的迴圈中刪除元素都是一件非常危險的事情,包含最簡單的陣列。因為刪除元素後,迴圈有可能會找不到下一個元素,迴圈就會當機,所以都要用一些特殊的方法去處理。
而在 C++ STL 的容器迴圈中刪除元素可以使用以下的特殊方法。
Sequence containers (序列容器) : vector、string、deque、list
for (it = c.begin(); it! = c.end(); )
{
if (is need delete)
it = c.erase(it);
else
it++;
}
Associative containers (關連式容器) : set、multiset、map、multimap
for (it = c.begin(); it! = c.end(); )
{
if (is need delete)
c.erase( it++ );// it++ 是 operator 有回傳值
else
it++;
}
小提醒:STL map 的 erase() 在 visual c++ 與 linux gcc 下可能有差異,使用前還是要測試一下。