按降序对1000个元素数组(值1000000)进行排序时,无法理解Comparator函数的行为。 (该数组已索引1个)
比较器函数定义的第一个实例具有随机性 数组中某些索引处为零。
比较器函数定义的第二个实例工作正常。 谁能解释为什么会这样
bool func(long long a, long long b){
return (a >= b);
}
sort (A+1, A + 1000 + 1, func);
bool func(long long a, long long b){
return (a > b);
}
sort (A+1, A + 1000 + 1, func);
输出1: 1000000 1000000 1000000 0 0 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000
输出2: 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000
答案 0 :(得分:4)
将自定义比较函数传递给std::sort
时,它们必须引起所谓的“严格弱排序关系”(请参阅here)。您的功能
bool func(long long a, long long b){
return (a >= b);
}
不满足这些要求(例如func(42, 42) != false
)。这将导致不确定的行为,结果序列可以是任何东西。
答案 1 :(得分:1)
您正在观察的问题是由于对相等值进行排序。
如果您有一个序列3 3 3 3 4
并尝试对其进行排序,则仅使用>=
(或任何其他等号)的算法将无法区分该数字应放置的顺序。
在我之前的示例中,当比较第一个3
和第二个inline bool func(long long a, long long b) { return b < a; }
时,比较函数表示第一个小于第二个。然后,如果出于某种原因,它试图将第二个与第一个进行比较,则相同的函数会说第二个小于第一个。这会混淆算法并使其行为不确定。
因此,标准期望您提供一个比较明确的比较功能。就您而言,这很容易,只需不带等于就使用运算符:
bool isEqual(a,b) = !func(a,b) && !func(b,a)
请注意,如果算法需要知道两个值是否相等,则需要两次调用函数("stdout_lines": [
"",
"D:\\Program Files\\Apache Softwarecoder.exe",
"",
"D:\\Program Files\\Apache Software\\cat8.5.exe",
"",
"",
""
]
)。
这不是最佳选择(2个测试而不是1个测试),所以这就是在C ++ 20中添加了飞船运算符的原因。