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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐