首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

循环删除地图,为什么不出错呢

2012-09-15 
循环删除map,为什么不出错呢mapint,inttmepMaptmepMap.insert(make_pair(1,2))tmepMap.insert(make_pa

循环删除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;



热点排行