下面是一个非常基本的代码,使用std::sort
和自定义比较器函数对输入数据进行排序。
然而,比较器需要来自输入的值,该值不是数据的一部分,即下面的m
变量。
当我针对在线评判运行代码时,我遇到了运行时错误 - 分段错误。
我想知道是什么导致这个问题,或者如何调试这个问题,因为我的想法已经用完了。提前谢谢。
问题是here。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int m;
bool cmp(int a, int b);
int main()
{
int n, i;
vector<int> num;
int input;
while(cin >> n >> m)
{
if(n == 0 && m == 0)
{
cout << "0 0" << endl;
break;
}
for(i = 0; i < n; ++i)
{
cin >> input;
num.push_back(input);
}
sort(num.begin(),num.end(),cmp);
cout << n << " " << m << endl;
for(i = 0; i < num.size(); ++i)
{
cout << num[i] << endl;
}
num.clear();
}
return 0;
}
bool cmp(int a, int b)
{
if(a%m > b%m)
return 0;
else if(a%m < b%m)
return 1;
else //a%m == b%m
{
if(a%2 == 0 && b%2 == 0)
{
if(a < b)
return 1;
else return 0;
}
else if(a%2 == 0 && b%2 != 0)
{
return 0;
}
else if(a%2 != 0 && b%2 == 0)
{
return 1;
}
else
{
if(a < b)
return 0;
else return 1;
}
}
}
答案 0 :(得分:2)
您的cmp函数不符合严格弱排序的标准(http://en.wikipedia.org/wiki/Weak_ordering#Strict_weak_orderings)。非反射性标准(即cmp(x,x)必须评估为假)被违反。
对于任何奇数x cmp(x,x)将评估为真。您可能希望更改最里面的else子句中的两个return语句:
else {
if(a < b) return true;
else return false;
}
或更短:
else {
return a < b;
}
在这种形式下,保证了无反思性。从目前为止我看到的其他标准也应该是有效的。