由于工程需要,我们可能需要遍历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会造成迭代器失效,
本文介绍了一种在遍历C++ STL Map过程中安全删除元素的方法,避免了迭代器失效的问题。通过对比不同删除策略,详细解释了如何正确使用迭代器进行元素删除。
1396

被折叠的 条评论
为什么被折叠?



