在c++中使用for循环遍历map并删除map中的元素的注意事项

最近在写代码的过程中,发现了一处删除map元素导致的异常。主要是因为不安全的使用for循环遍历map并删除元素导致的。 我一开始的时候,代码如下:

for(it_pos = map.begin();it_pos!=map.end();it_pos++)
{
	printf("111\n");
    if( 0 == it_pos->second )
    {
        map.erase(it_pos);
    }
	printf("222\n");
}

在运行起来之后,发现整个线程只输出了一次 "111\n222\n",线程就卡在了,不在往后运行了,后来查阅资料,发现了是 it_pos 自增的问题。参考页面是:std::map的安全遍历并删除元素的方法

这上面代码的问题是,当我们删除了 it_pos 之后,it_pos 这个迭代器已经失效了,对其进行 it_pos++ 操作,就是未知的操作,会引起异常。所以我们应该在删除 it_pos 之前就对其进行 ++。改成下面的代码就可以解决问题了。

for(it_pos = map.begin();it_pos!=map.end();)
{
    if( 0 == it_pos->second )
    {
        map.erase(it_pos++);
    }
    else
    {
    	it_pos++;
    }
}

转载于:https://my.oschina.net/u/2447371/blog/3015496

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值