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++ 文檔中推薦的方式。