【c++】map 迭代器刪除示例

C++ STL中的map是非常常見的。通常我們用如下方式來遍歷,並且刪除map中的一些entry:

map<int, int> mp;
mp.insert(make_pair(1,1));
mp.insert(make_pair(2,3)); // insert some elements
for (map<int, int>::iterator iter = mp.begin(); iter != mp.end(); iter++) {
    if (iter->first == 1) mp.erase(iter); // NOTE it is not safe!
    else iter->second++;
}

上面的刪除並不安全,因爲mp.erase(iter) 之後,iter 的結構已經改變了,此時 for 循環張的 iter++ 可能會出現問題。因此推薦下面的改法:

for (map<int, int>::iterator iter = mp.begin(); iter != mp.end(); ) {
    if (iter->first == 1) mp.erase(iter++); // NOTE it is SAFE!
    else iter->second++;
}

這裏的刪除時安全的,因爲iter在刪除前已經會先進行緩存一下,再傳給erase去刪除。因此 iter++ 是在原先的 iter 基礎上進行的。這種方式也是 C++ 文檔中推薦的方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章