什么是谓语在C ++? [关闭]

问题描述 投票:33回答:4

你能举些例子或某个主题的链接。

c++ class structure predicate
4个回答
43
投票

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

  • 这是什么元素,我们正在寻找?
  • 是第两个参数首次下令在我们的订单?
  • 有两个参数相等?

几乎所有的STL algorithms采取谓词作为最后一个参数。

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


11
投票

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

每当一个算法期望的功能对象,当施加到解引用相应的迭代器的结果返回可测试为真值的谓词参数被使用。换句话说,如果一个算法需要预解码谓词作为参数,并第一次作为其迭代的说法,它应该正确构建if (pred(*first)){...}工作。该函数对象pred不得通过iterator的反引用应用任何非恒定的功能。此功能对象可以是起作用的指针,或一个类型的对象与适当的函数调用操作。

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

因此,在英语中,它是一个功能或用operator()过载,一个对象:

  • 采用单个参数。在算法的情况下,参数的类型是从所讨论的算法的解除引用的迭代器的类型隐式转换,或者是一个常量引用这样的类型,或者在推它可以是一个非const引用的确切只要迭代不是常量性类型。
  • 返回可用于真理在if语句(因为C ++的语言规则,因此,同样在一个while环等)进行测试的值。
  • 不修改其参数(至少,只要不是参数类型是const的,正确的...)

此外,由于许多算法没有规定操作的确切顺序执行它们,你可能会发现,你得到不可预知的行为,如果你的断言是不相符的,即如果结果取决于比可以调用之间改变输入值以外的任何。

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

以使适配器和其它部件,以操纵功能对象采取它需要一个或两个参数,该函数的对象对应地提供的typedef argument_type和result_type的针对一个参数和first_argument_type,second_argument_type功能对象和result_type的该两个参数的函数对象。


8
投票

这不是专门针对C ++(或者甚至是计算机语言)。在自然语言的语法,在一份声明中,如门是开放的,是开放的部分是谓语,要么是真的还是假的,所以说你有一类cGate,有一个成员函数bool cGate::isOpen(),这样的功能将是一个谓语。

基本上,如果函数询问关于该对象状态或值的问题,其结果是真或假,那么它是一个谓词。


7
投票

谓词是仅仅是返回真或假取决于其输入(一个或多个)是否满足某些条件的函数。通常,谓词函数应该是纯;给出相同的输入时(所以bool isDateInPast(Date &date)将是一个糟糕的谓语)应该总是返回相同的结果。

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

© www.soinside.com 2019 - 2024. All rights reserved.