通过迭代器安全删除map元素

本文介绍了一种在遍历C++ STL Map过程中安全删除元素的方法,避免了迭代器失效的问题。通过对比不同删除策略,详细解释了如何正确使用迭代器进行元素删除。

由于工程需要,我们可能需要遍历map中的所有元素,并删除其中不满足要求的元素.

一般情况下我们通过迭代器实现这一功能.

迭代器实际上就是一个指针,如果没有安全删除指针,会造成迭代器失效,程序报错,或者迭代器错乱无法指向正确的元素.

/*该函数实现 删除相邻2个元素之间key或者value差值在thresh_dist以内的所有元素,最后保留符合条件的所有元素*/
void deleteNearLine(map<int,int>& lines,int thresh_dist){
    if(lines.size()<2){
        return;
    }
 
    map<int,int>::iterator it=lines.begin();//负责指向当前元素
    map<int,int>::iterator it_now = lines.begin();//负责指向下一个元素
    for(++it;it!=lines.end();++it){
       
       if(abs((it_now->first)-(it->first))<=thresh_dist || (abs(it_now->second-it->second)<=thresh_dist))//距离过近,删除该元素
        {  
            lines.erase(it--);
            
        }
       
        it_now = it;
       
    }
  
}

以上代码是没有问题的.

其中关键代码(1)

lines.erase(it--);

对比代码(2)

lines.erase(it);
it--;

由于map是关联容器,元素在存储上并不是占用连续空间的.

迭代器在执行erase操作的时候是输入it的一个副本,所以在删除之前同步将迭代器进行自增或自减并不会影响迭代器的有效值

而代码2会造成迭代器失效,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值