猿问

运行时提示set/map iterator not incrementable.这是为什么?

以下代码用了set的erase,运行时提示set/map iterator not incrementable.这是为什么呢?
#include<iostream>#include<algorithm>#include<string>#include<set>#include<map>#include<cstdio>using namespace std;int a[600000];set<int> see;set<int>::iterator it;
int main( ){ int n; int shur; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; see.insert(a[i]); } sort(a,a+n); int ds,erasum=0; for(int i=n-1;i>=0;i--) { ds=a[i]*2; if(see.lower_bound(ds)!=see.end()) { it=see.find(a[i]); see.erase(it++); it=see.lower_bound(ds); see.erase(it++); erasum++; } } int sum=see.size()+erasum; cout<<sum<<endl; return 0;}
以下为代码#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
int a[600000];
set<int> see;
set<int>::iterator it;
int main( ){
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
see.insert(a[i]);
}
sort(a,a+n);
int ds,erasum=0;
for(int i=n-1;i>=0;i--)
{ ds=a[i]*2;
if(see.lower_bound(ds)!=see.end())
{  
it=see.find(a[i]);
see.erase(it++);  
it=see.lower_bound(ds);
see.erase(it++);
erasum++;
}
}
int sum=see.size()+erasum;
cout<<sum<<endl;
return 0;
}

慕工程0101907
浏览 193回答 2
2回答

白猪掌柜的

要erase list里的元素时代码可写为以下形式,可避免list iterator incrementablestd::list<int> T;std::list<int>::iterator rpos;for(rpos=T.begin();rpos!=T.end();){rpos = T.erase(rpos);}其他容器也是差不多的,但是map的有点不同,map的erase不是返回下一个iterator的不过可以如下处理std::map<,> T;std::map<,>::iterator rpos;for(rpos=T.begin();rpos!=T.end();){if(...){T.erase(rpos++);&nbsp;}else{++rpos;}

一只甜甜圈

it=see.find(a[i]); 需要判断it是否为see.end() 不是才能erase 要不然就出错啦
随时随地看视频慕课网APP
我要回答