c++中的比较函数错误:比较器无效



我做了一个简单的命令行函数,如下所示:

bool function(int a, int b){
if (a % 2 == 0) {
return (a > b);
}
if (a % 2 == 1) {
return (a < b);
}
return false;
}

我的主要功能如下:

int main() {
vector<int> vector = {8, 4, 4, 8, 4, 1, 4, 4, 6, 10, 12 };
sort(vector.begin(), vector.end(), function);
cout << endl;
for (int i : vector) {
cout << i << " ";
}

return 0;
}

函数应该排列一个数组,使所有偶数都在数组的一部分中,并且所有奇数都在该数组的另一部分。

当我尝试运行代码时,它会给我错误";无效比较器";。你知道可能出了什么问题吗?

我假设您在std::sort中使用了此比较器。那么它必须满足要求比较:

对于所有a,comp(a,a)==false

好的,对于相等的值,比较器将始终返回false

如果comp(a,b)==true,则comp(b,a)==false

那个失败了:

  • function(1, 2) == true,所以1应该在2之前,但是
  • function(2, 1) == true,所以2应该在1之前,哇

如果comp(a,b)==truecomp(b,c)==true,则comp(a,c)==true

那个失败了:function(2, 1)==truefunction(1, 3)==true,但function(2, 3)==false


这个代码应该可以实现您想要的:

bool function(int a, int b){
if(a % 2 == b % 2) {
// If both are even or both are odd simply compare the numbers
return a < b;
} 
else {
// if one is even and the other is odd then
// a should come before b if a is even
return a % 2 == 0; 
}
}

[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]进行排序将导致[ 2, 4, 6, 8, 1, 3, 5, 7, 9, ]

另一个答案解释了这个问题,并提供了一个解决方案,假设结果数组的一半必须排序。

如果不是,您可以使用一个更简单的比较器:return a % 2 < b % 2。然后,您还应该使用std::partition而不是std::sort(因为它可能更快(,或者如果您想维持原始订单,则使用std::stable_partition

相关内容

  • 没有找到相关文章

最新更新