您能提供一些示例或主题链接。
答案 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()
重载的对象:
if
语句中测试真值的值(因此,由于C ++的语言规则,也在while
循环中等等)。此外,由于许多算法没有指定它们执行的操作的确切顺序,因此如果谓词不一致,您可能会发现不可预测的行为,即结果取决于输入值以外的任何其他值在电话之间切换。
除算法外,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
?”。