[英]How does below comparator function works in c++?
bool comp(int a,int b){
if ((a > 0 && b > 0) || (a < 0 && b < 0))
return false;
if ((a > 0) && (b < 0))
return false;
}
对于给定的包含正整数和负整数的数组,上述函数可用于重新排列数组,以使负整数后跟正整数,并保留元素的顺序。
例:
int arr [] = {1,2,-3,-1}, n=sizeof(arr)/sizeof(int);
sort(arr,arr+n, comp);
output : {-3,-1,1,2}
但是我无法理解它是如何工作的,有人可以解释吗?
您的断言有两个方面是错误的:
如果您了解我的意思,则不能保证std::sort
保留不需要排序的元素的顺序。
您的comp
函数的行为是不确定的,因为它在所有控制路径上都没有明确的return
值。
一种补救方法是使用std::stable_sort
,它将尽最大可能保留元素的顺序。 比较器功能可以被调节,使得它的true
如果第一个参数是负的,第二个是阳性(让我们定义0为正):
bool comp(int a, int b){
return a < 0 && b >= 0;
}
另一种解决方法是使用std::stable_partition
。
但是我无法理解它是如何工作的,有人可以解释吗?
我试图解释它应该如何工作,但实际上,它不起作用:)
bool comp(int a, int b) {
if((a > 0 && b > 0) || (a < 0 && b < 0))
return false;
if((a > 0) && (b < 0))
return false;
return true;
}
此代码试图比较符号:检查a
符号是否比b
符号“小”。 假设负数小于正数。 因此,-1的符号小于1的符号,-3的符号不小于-1的符号。
这里的问题是比较器应始终符合https://en.wikipedia.org/wiki/Weak_ordering#Strict_weak_orderings的要求 。
简而言之,严格的弱排序是:对于任何a
和b
,只有一个条件成立: a < b
或b < a
或b == a
。 一个条件中有多个为真时,就不应存在。
当生产代码中违反严格的弱订购时,将发生非常糟糕的事情:加班,截止日期失败,甚至更糟。
您的sort()在以下数组上将失败: { 1, 0, 2, 0, -3, 0,-1 }
因为违反了严格的弱排序: comp(-1, 0)
为true并且comp(0, -1)
是真的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.