亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

運行時提示set/map iterator not incrementable.這是為什么?

運行時提示set/map iterator not incrementable.這是為什么?

C++
慕工程0101907 2023-04-22 18:14:17
以下代碼用了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;}
查看完整描述

2 回答

?
白豬掌柜的

TA貢獻1893條經驗 獲得超10個贊

要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;
}

查看完整回答
反對 回復 2023-04-25
?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

it=see.find(a[i]); 需要判斷it是否為see.end() 不是才能erase 要不然就出錯啦

查看完整回答
反對 回復 2023-04-25
  • 2 回答
  • 0 關注
  • 250 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號