我做了一个简单的命令行函数,如下所示:
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)==true
和comp(b,c)==true
,则comp(a,c)==true
那个失败了:function(2, 1)==true
,function(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
。