iterator not dereferencable 。。。。 求大神,郁闷啊!!!

#include"intset.h"#include<iostream>#include<set>usingnamespacestd;typedefstd::set<in... #include "intset.h"
#include <iostream>
#include <set>
using namespace std;

typedef std::set<int> set_int;
void IntSet::insert(int n){
set_int::insert(n);
}
bool IntSet::IsEqual(IntSet s1){
set<int>::iterator ita,itb;
ita= set_int::begin();
itb=s1.begin();
if( set_int::size()!=s1.size())
return false;
for(;ita!=set_int::end()&&itb!=s1.end();ita++,itb++){
if((*ita)!=(*itb))
return false;
}
return true;
}

//求s1 与s2 的并
IntSet IntSet::incorporate2(IntSet s1, IntSet s2){
IntSet ss;
set<int>::iterator it;
for(it=s1.begin();it!=s1.end();it++)
ss.insert(*it);
for(it=s2.begin();it!=s2.end();it++)
ss.insert(*it);
return ss;
}

//求s1 与s2 的交
IntSet IntSet::union2(IntSet s1, IntSet s2){
IntSet ss;
set<int>::iterator ita,itb;
ita=s1.begin();
itb=s2.begin();
while(ita !=s1.end()&&itb !=s2.end()){
while(*ita>*itb&&ita !=s1.end()&&itb !=s2.end())
itb++;
if(*ita==*itb&&ita !=s1.end()&&itb !=s2.end()){
ss.insert(*ita);
ita++; //此处出错!
itb++; //此处出错!到达end时没有跳出循环
}
while(*ita<*itb&&ita !=s1.end()&&itb !=s2.end())
ita++;
}
return ss;
}

void IntSet::print(){
set_int::iterator it;
int i=0;
for(it=set_int::begin();it!=set_int::end();it++,i++){
cout<<*it<<'\t';
if(i%6==0)
cout<<endl;
}
cout<<endl;
}
展开
 我来答
frankxieke
推荐于2016-12-01 · 计算机专业相关文档分享
frankxieke
采纳数:104 获赞数:253

向TA提问 私信TA
展开全部
while(*ita>*itb&&ita !=s1.end()&&itb !=s2.end())
itb++;
if(*ita==*itb&&ita !=s1.end()&&itb !=s2.end()){
ss.insert(*ita);
ita++; //此处出错!
itb++; //此处出错!到达end时没有跳出循环
}
while(*ita<*itb&&ita !=s1.end()&&itb !=s2.end())
ita++;
将这三个的关系改成,你的问题貌似就不存在了
if(*ita>*itb&&ita !=s1.end()&&itb !=s2.end())
itb++;
else if(*ita==*itb&& ita !=s1.end()&& itb !=s2.end()){
ss.insert(*ita);
ita++; //此处出错!
itb++; //此处出错!到达end时没有跳出循环
}
else if (*ita<*itb&&ita !=s1.end()&&itb !=s2.end())
{
ita++;
}探究一下为什么呢?
更多追问追答
追问
可是我在每一次的循环和if中都使用了ita !=s1.end()&&itb !=s2.end(),还是不懂为什么这样会出错,我在if后面重新检查一次ita !=s1.end()&&itb !=s2.end(),然后就好了,真心不懂.......求解释
if(*ita==*itb&&ita !=s1.end()&&itb !=s2.end()){
ss.insert(*ita);
ita++;
itb++;
}
if((ita==s1.end())||(itb==s2.end()))
break;
追答
实际上当你这个
if(*ita==*itb&&ita !=s1.end()&&itb !=s2.end()){
ss.insert(*ita);
ita++;
itb++;
}
不满足条件时,可能是因为ita == s1.end(),或者itb == s2.end();
假如说是ita == s1.end()造成的,那么你下面做的
while(*ita<*itb&&ita !=s1.end()&&itb !=s2.end())
ita++;
就会出错,因为此时ita已经是一个空指针了

所以使用if{}else if{}else if{}就会避免这种情况了
而你写的这三个语句是顺序执行的,也就是每次大循环这个三个语句都会执行一边。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式