C++问题(关于STL的set)

以下代码用了set的erase,运行时提示set/mapiteratornotincrementable.这是为什么呢?#include<iostream>#includ... 以下代码用了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;
}
展开
 我来答
zhaoyj163em
2014-01-16 · TA获得超过1033个赞
知道小有建树答主
回答量:268
采纳率:0%
帮助的人:371万
展开全部

楼主,之所以出现你说的问题,是因为find之后,有可能因为see根本不包含a[i]而找不到a[i],然后it指针指向一个错误的地方,这个时候erase指针it就会出错了。

就像上面我测试用的数据那样。

你可以试试上面那组数据

9

2 4 1 5 3 1 2 6 4 

追问
但是已经在输入a[i]的时候就把a[i]insert进see里面了,为什么会找不到的?
追答
因为我这里有两个2,set他是会自动去重的,而你的a数组还是有2个2的话,就会出问题。。也就是你不可能从see里面删除2个2。
guishuanglin
2014-01-16 · TA获得超过234个赞
知道小有建树答主
回答量:211
采纳率:0%
帮助的人:93.2万
展开全部
要erase list里的元素时
代码可写为以下形式,可避免list iterator incrementable
std::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++);
}
else
{
++rpos;
}
追问
我使用erase时也是see.erase(it++); 但还是出现这种情况。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
z490721123
2014-01-16 · 超过25用户采纳过TA的回答
知道答主
回答量:115
采纳率:0%
帮助的人:69.7万
展开全部
it=see.find(a[i]); 需要判断it是否为see.end() 不是才能erase 要不然就出错啦
追问
但是在输入a[i]的时候已经把a[i]insert进see里面,不是一定会找到a[i]吗?
追答
it=see.lower_bound(ds);  see.erase(it++);
这个呢,
是不是应该在
it=see.find(a[i]); see.erase(it++);
之后判断
if(see.lower_bound(ds)!=see.end())

你在it=see.find(a[i]); see.erase(it++); 不能保证see.lower_bound(ds)!=see.end()吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式