【问题标题】:Evaluation of the binary predicates in C++在 C++ 中评估二元谓词
【发布时间】:2016-11-27 22:20:51
【问题描述】:

如何评估二元谓词?

例如,如果我想按降序排序,那么我应该写:

bool isGreater(int x, int y) 
{
    return x > y;
}

bool isGreater(int x, int y) 
{
    return y > x;
}

两者之间究竟有什么区别?我知道这两个参数会相互比较,但返回结果应该是什么 - truefalse?这有什么关系?所以,我的问题基本上是,如果我不知道它们传递的顺序,我如何确定第一个参数是否应该在第二个之前?

sort() 函数将以这种方式调用(@​​987654328@ 是要排序的数组):

sort(height, height+N, isGreater);

注意:我确实引用了this onethis one 之类的链接,但他们并没有明确关注这个问题。

有人可以澄清我的疑问吗?谢谢!

【问题讨论】:

  • 是的。但是,当我想按降序排序时,如何确定使用哪一个?如何调用二元谓词以及它的参数是什么?
  • 如果第一个参数应该在第二个参数之前,谓词应该返回 true。因此,对于降序,您需要 x > y。
  • 当然可以。该算法将根据需要执行尽可能多的比较以确定所有元素的相对顺序。
  • 只要排序算法需要决定任何两个元素如何仅相对于它们自身进行排序,就会调用谓词。我们不知道排序算法是如何工作的。可以调用谓词来比较我们集合中的任何两个元素。它通常会在单个排序操作过程中被多次调用。
  • 不,使用谓词的全部意义在于您只需要一种排序算法。享受它很容易的事实。

标签: c++ c++11 predicate


【解决方案1】:

这是一个非常简单的伪代码升序排序算法:

for i ← 1 to length(A)-1
    j ← i
    while j > 0 and A[j-1] > A[j]
        swap A[j] and A[j-1]
        j ← j - 1
    end while
end for

与谓词“MyCompare(x, y) { return x

for i ← 1 to length(A)-1
    j ← i
    while j > 0 and MyCompare(A[j-1], A[j]) == false
        swap A[j] and A[j-1]
        j ← j - 1
    end while
end for

现在排序算法可以通过改变谓词来按任意顺序排序。由于这个谓词是 std::sort 的参数,这意味着 std::sort 可以按任何顺序排序。

【讨论】:

  • 感谢您的回答。但是,我的问题并不是专门关于按升序排序的。我已经改写了我的问题并用粗体准确地陈述了它。
  • 谓词的工作只是确定两个参数的正确顺序。如果您想按降序排序,那么您的谓词将是: bool MyCompare(x,y) { return x > y; }。如果 x = 3 且 y = 5,则返回 false 以指示 y 应该在 x 之前。如果 x = 5 和 y = 3,它将返回 true 以指示 x 应该在 y 之前。在给定的排序示例中检查它是如何工作的。您可以看到,当它从谓词中获取 false 时,排序将重新排序值。但是排序如何工作的细节最终是无关紧要的。您的谓词只需要正确即可。
  • 那么,如果我写bool MyCompare(x,y) { return x < y; },这不也行吗?如果x = 3y = 5,则返回true;否则为假。为什么这不能给我降序?很抱歉有这么多问题,感谢您的帮助。
  • 这将按升序排序。返回 x y 表示降序。我无法理解你为什么感到困惑。它们是相反的,所以它们给出的结果与我们在逻辑上所期望的相反。
  • 当你得到 x = 3y = 5 并返回 true 时,true 让排序算法知道 3 应该在 5 之前,这是升序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多