什么是C ++中的谓词?

时间:2011-05-07 14:13:06

标签: c++ class structure predicate

您能提供一些示例或主题链接。

4 个答案:

答案 0 :(得分:39)

谓词是返回布尔值或具有bool operator()成员的对象的C ++函数。 一元谓词采用一个参数,二元采用两个,依此类推。 问题谓词的例子可以回答特定的算法:

  • 这个元素是我们要找的吗?
  • 我们的订单中首先排列了两个参数中的第一个吗?
  • 这两个论点是否相等?

几乎所有STL algorithms都将谓词作为最后一个参数。

您可以使用标准,自定义和/或谓词制作类(here is a good reference)构建新谓词。

答案 1 :(得分:10)

C ++标准定义Predicate如下(25/7):

  

使用Predicate参数   每当算法期望a   应用于的函数对象   解除引用的结果   对应的迭代器返回一个值   可以测试为真。换句话说,如果   一种算法将Predicate pred作为   它的论点和第一个作为它的迭代器   论证,它应该正常工作   构造if (pred(*first)){...}。   函数对象pred不得   应用任何非常数函数   通过解引用的迭代器。   该功能对象可以是指针   功能,或类型的对象   用适当的函数调用   操作

BinaryPredicate有两个参数的类似定义。

所以在英语中,它是一个函数或具有operator()重载的对象:

  • 采用单个参数。在算法的情况下,参数类型可以从所讨论的算法的解引用迭代器的类型中隐式转换,或者是对这种类型的const引用,或者在推送时它可以是对精确的非const引用。只要迭代器不是const_iterator就输入。
  • 返回一个可以在if语句中测试真值的值(因此,由于C ++的语言规则,也在while循环中等等)。
  • 不会修改其参数(至少,只要参数类型是const-correct就不会......)

此外,由于许多算法没有指定它们执行的操作的确切顺序,因此如果谓词不一致,您可能会发现不可预测的行为,即结果取决于输入值以外的任何其他值在电话之间切换。

除算法外,not1中的逻辑否定符<functional>采用Predicate模板参数。在这种情况下,还有一个额外的要求(20.3 / 5):

  

启用适配器和其他   操纵功能的组件   带有一个或两个参数的对象   它是必需的功能   对象相应地提供   typedefs argument_type和result_type   对于带有一个的函数对象   参数和first_argument_type,   second_argument_type和result_type   对于需要两个的函数对象   参数。

答案 2 :(得分:8)

它不是特定于C ++(甚至是计算机语言)。在自然语言语法中,在诸如gate 打开之类的语句中,是开放的部分是谓词并且是真或假,所以说你有一个类{ {1}},使用成员函数cGate,这样的函数就是谓词。

基本上,如果函数询问有关对象状态或值的问题,并且结果为true或false,则它是谓词。

答案 3 :(得分:7)

谓词只是一个函数,它返回true或false,具体取决于它的输入是否满足某些条件。通常,谓词函数应该;当给定相同的输入时,它应该始终返回相同的结果(因此bool isDateInPast(Date &date)将是谓词)。

例如,它们通常用作STL排序例程的回调(即“输入a小于输入b”。