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++ 文档中推荐的方式。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-17 22:59:08