set元素如果用迭代器遍历,一边遍历一边删除,会大大滴出问题。。遇到很多次了,于是查了一下资料,得到以下结论::
(´・Д・)」

//set删除元素的函数
s.erase(<#const_iterator __p#>);//用迭代器删除元素
s.erase(<#const key_type &__k#>);//用key删除元素
一些测试::

⬆️这个没问题
然鹅

⬆️这个有问题

⬆️这个也有问题
why???
原因是,当删除set中某个元素时,当前元素迭代器会失效,所以用key或者迭代器删除元素后,再令迭代器++这个操作是会有问题的。
所以,利用迭代器遍历元素并删除时的正确写法为:
for(it=s.begin();it!=s.end();){
int t=*it;
cout<<"t="<<t<<endl;
if(*it%2==1){
s.erase(it++);//删除所有的奇数,用迭代器删除,同时迭代器自增1
cout<<"删掉的t="<<t<<endl;
}
else{
++it;
}
}
“因为传入erase的是个it的副本,it++是下一个有效迭代器”
在传入erase的时候令it++,可以避免迭代器失效后产生的问题。
最后
以上就是体贴鱼最近收集整理的关于set中元素删除相关问题的全部内容,更多相关set中元素删除相关问题内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复