什么是C++中的谓词?

mun*_*ish 35 c++ structure class predicate

你能给出一些主题的例子或链接吗?

And*_*rov 43

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

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

几乎所有STL算法都将谓词作为最后一个参数.

您可以使用标准,自定义和/或谓词制作类来构造新谓词(这是一个很好的参考).

  • 谓词不一定是函数,那么可以改为函子.至少对于标准算法而言,它们不必返回"bool"或具有"operator bool()"的东西,它可以返回任何可测试为true或false的东西.所以转换为`bool`的内置类型,如指针,也可以. (14认同)

Ste*_*sop 12

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

只要算法需要一个函数对象,当应用于取消引用相应迭代器的结果时,就会使用Predicate参数返回一个testable值为true.换句话说,如果算法将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 .


Cli*_*ord 9

它不是特定于C++(甚至计算机语言).在自然语言语法中,在诸如门打开的语句中,开放部分是谓词并且是真或假,所以说你有一个类cGate,具有成员函数bool cGate::isOpen(),这样的函数将是谓词.

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


Oli*_*rth 7

谓词只是一个函数,它返回true或false,具体取决于它的输入是否满足某些条件.一般来说,谓词函数应该是纯粹的 ; 当给定相同的输入时,它应该总是返回相同的结果(因此bool isDateInPast(Date &date)将是一个错误的谓词).

例如,它们通常用作STL排序例程的回调(即" 输入a少于输入b ").

  • @Ben:但是`Compare`参数的要求严格要求强于`BinaryPredicate`参数的要求.比较器必须返回"true"或"false"(而不是任何真值可测试值),当然必须实现严格的弱序.但由于C++ 0x使用术语"谓词"而不是"UnaryPredicate",我们不得不得出结论,虽然"二元谓词"是英语中的"谓词",但"BinaryPredicate"不是"谓词".标准ESE.疯狂的事情 :-) (2认同)