读书人

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

发布时间: 2012-09-15 19:09:28 作者: rapoo

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



读书人网 >C++

热点推荐