sort()方法c ++中的比较器函数。针对大量数字获取不同的解决方案

时间:2019-07-15 10:49:25

标签: c++ sorting c++14

按降序对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

2 个答案:

答案 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中添加了飞船运算符的原因。