C++ 使用std::sort()对自定义类的向量进行排序会导致分段错误
我想使用std::sort()和重载<运算符对自定义类的向量进行排序。根据此处的答案:,我尝试了以下代码:C++ 使用std::sort()对自定义类的向量进行排序会导致分段错误,c++,C++,我想使用std::sort()和重载>(ifstream&in,Evnt&E){ 煤焦垃圾; 在>>垃圾>>E.Month>>垃圾>>E.Day; getline(in,E.mydata); 返回; } bool操作员>tmpevnt) v、 推回(tmpevent) 排序(v.begin(),v.end()); 返回0; } 最后一行有点不规则地导致分段错误。我非常仔细地跟踪了各种示例,因此我在找出问题所在时遇到了一些问题。似乎只有当我在中读取了大量(~20+)项时,
class Evnt {
private:
int Day, Month;
string mydata;
public:
friend ifstream& operator >>(ifstream &in,Evnt &E){
char junk;
in >>junk>>E.Month>>junk>>E.Day;
getline(in,E.mydata);
return in;
}
bool operator<(const Evnt &E) const{
if(Month < E.Month)
return true;
else if(Day < E.Day)
return true;
return false;
}
};
int main(){
ifstream inpt("inputfile.txt")
Vector <Evnt> v;
Evnt tmpevnt;
while(intp>>tmpevnt)
v.push_back(tmpevent)
sort(v.begin(), v.end());
return 0;
}
类Evnt{
私人:
整数天,月;
字符串mydata;
公众:
friend ifstream&operator>>(ifstream&in,Evnt&E){
煤焦垃圾;
在>>垃圾>>E.Month>>垃圾>>E.Day;
getline(in,E.mydata);
返回;
}
bool操作员>tmpevnt)
v、 推回(tmpevent)
排序(v.begin(),v.end());
返回0;
}
最后一行有点不规则地导致分段错误。我非常仔细地跟踪了各种示例,因此我在找出问题所在时遇到了一些问题。似乎只有当我在中读取了大量(~20+)项时,才会发生这种情况。std::sort需要一个强制执行的比较操作 这意味着如果
a
返回true
,b
不能返回true
修复比较运算符
bool operator<(const Evnt &E) const{
if(Month < E.Month)
return true;
else if(Month == E.Month && Day < E.Day)
return true;
return false;
}
bool操作符std::sort
需要一个比较操作,该操作将
这意味着如果a
返回true
,b
不能返回true
修复比较运算符
bool operator<(const Evnt &E) const{
if(Month < E.Month)
return true;
else if(Month == E.Month && Day < E.Day)
return true;
return false;
}
bool运算符要做的第一件事是将其放入调试器中,并找出其崩溃的位置。此处的E.treest
?如果这只是垃圾数据,请为其创建一个局部变量。您的比较运算符无效。给定日期2009年3月和2002年12月,您的代码将声明两个日期都小于另一个日期。您没有检查单个的操作符>
操作是否在Evnt::operator>
内部工作。如果Month>E.Month
您仍在比较它们的日期。要做的第一件事是将其放入调试器中,并找出崩溃的位置。这是什么E.这里有吗?如果这只是垃圾数据,请为其创建一个局部变量。您的比较运算符无效。给定日期09年3月
和02年12月
,您的代码将声明两个日期都小于另一个日期。您没有检查单个操作员>
操作是否在Evnt::operator>
内部工作。如果月>E.Month
您仍在比较它们的日
。