循环删除map,为什么不出错呢
map<int,int>tmepMap;
tmepMap.insert(make_pair(1,2));
tmepMap.insert(make_pair(12,12));
tmepMap.insert(make_pair(111,11112));
map<int,int>::const_iterator iter;
for(iter=tmepMap.begin(); iter!=tmepMap.end(); /*++iter*/)
{
tmepMap.erase(iter++);
}
以上的for循环的代码和以下等价,为什么以下就出错了? 而上面的不出错呢
for(iter=tmepMap.begin(); iter!=tmepMap.end(); ++iter)
{
tmepMap.erase(iter);
}
[解决办法]
for(iter=tmepMap.begin(); iter!=tmepMap.end(); ++iter)
{
tmepMap.erase(iter);
}
这里是++iter,就是说当道tempMap的最后一个元素时,++iter后,要去删除最后一个元素的下一个,是你不知道的。
而上一个是iter++,不会出现删除最后一个元素的下一个
[解决办法]
因为tempMap.end是最后一个元素的下一个初始地址,不属于容器成员的地址
[解决办法]
不要武断地说等价.
erase 操作,导致当前迭代器无效. 不可再使用!
[解决办法]
实际上它们并不等价.
for(iter=tmepMap.begin(); iter!=tmepMap.end(); /*++iter*/)
{
tmepMap.erase(iter++);
}
等价于:
for(iter=tmepMap.begin(); iter!=tmepMap.end(); /*++iter*/)
{
map<int,int>::const_iterator temp = iter;
++iter;
tmepMap.erase(temp);
}
[解决办法]
因为mepMap.erase(iter);之后,iter无效了,所以下边的出错了,而上边的先iter++把下一个先保存到临时变量中,等执行完之后在++,所以没问题
tmepMap.erase(iter++);
基本等同与
map<int,int>::const_iterator tmpiter = iter;
tmpiter++;
tmepMap.erase(iter);
iter = tmpiter;