【问题标题】:What is predicate in C++? [closed]C++ 中的谓词是什么? [关闭]
【发布时间】:2011-08-20 18:23:34
【问题描述】:

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

【问题讨论】:

  • @Mr E:Stack Overflow 的好处在于,越来越多的 Google 搜索与编程相关的问题链接到这里。如果这里没有回答这些问题,那将永远不会发生,SO 也永远不会达到临界质量。所以“google it”从来都不是一个令人满意的答案。
  • @Mr E:你自己试过这个搜索吗?热门给出的定义是错误的,因此对提问者 +1 表示至少尝试咨询比平均水平更有可能给出正确答案的人。
  • @munish:你在 C++ 中是对的,特别是它可以引用 STL 算法的 谓词参数 和类似用法。您的问题可能涉及也可能不涉及,我从更一般的语法意义上理解了它,所以我学到了一些东西,所以你不只是谷歌它,因为这个问题确实添加到了 SO 存储库(IMO)。但是,我建议您将正文文本更改为要求不高且更广泛的内容,以避免不必要的关闭和否决。
  • @MrE 我有,我就是这样来的......
  • 这个问题怎么可能是“不是一个真正的问题”?标题还不够写答案吗?

标签: c++ class structure predicate


【解决方案1】:

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

  • 我们正在寻找这个元素吗?
  • 两个参数中的第一个是否按我们的顺序排在第一位?
  • 两个参数是否相等?

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

您可以使用标准、自定义和/或谓词生成类 (here is a good reference) 来构造新谓词。

【讨论】:

  • 谓词不一定是函数,也可以是函子。至少出于标准算法的目的,它们不必返回 booloperator bool(),它可以返回任何可测试为真或假的东西。所以转换成bool的内置类型,比如指针,也是可以的。
【解决方案2】:

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

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

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

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

  • 采用单个参数。在算法的情况下,参数类型可以从相关算法的解引用迭代器的类型隐式转换,或者是对这种类型的 const 引用,或者在推送时它可以是对确切的非 const 引用类型,只要迭代器不是 const_iterator。
  • 返回一个值,该值可以在 if 语句中进行检验(因此,由于 C++ 的语言规则,也在 while 循环等中)。
  • 不修改其参数(至少,只要参数类型是 const 正确的......)

此外,由于许多算法没有指定它们执行的操作的确切顺序,如果你的谓词不一致,你可能会发现你会得到不可预知的行为,即如果结果取决于输入值以外的任何东西在通话之间进行更改。

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

启用适配器和其他 操作功能的组件 接受一两个参数的对象 需要该功能 对象相应地提供 typedefs argument_type 和 result_type 对于带 1 的函数对象 参数和 first_argument_type, second_argument_type 和 result_type 对于需要两个的函数对象 论据。

【讨论】:

    【解决方案3】:

    它并不特定于 C++(甚至计算机语言)。在自然语言语法中,在诸如门 is open 之类的语句中,is open 部分是谓词,并且为真或假,因此假设您有一个类@ 987654321@,带有成员函数bool cGate::isOpen(),这样的函数就是谓词。

    本质上,如果函数询问有关对象状态或值的问题并且结果是真或假,那么它就是一个谓词。

    【讨论】:

      【解决方案4】:

      谓词只是一个函数,它根据其输入是否满足某些条件而返回真或假。一般来说,谓词函数应该是pure;当给定相同的输入时,它应该总是返回相同的结果(所以bool isDateInPast(Date &date) 将是一个谓词)。

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

      【讨论】:

      • 那个链接说它也必须是一个一元函数。
      • @Simon:是的,这不是一个非常通用的链接。我会从我的答案中删除它。
      • 谓词常用于 STL searching 例程,例如copy_if。是的,它们是一元的。排序函数不被视为谓词。
      • @Ben:Compare 参数的要求严格高于BinaryPredicate 参数的要求。比较器必须返回truefalse(而不是任何可真实检验的值),当然必须执行严格的弱顺序。但是由于 C++0x 使用术语 Predicate 而不是 UnaryPredicate,我们不得不得出结论,虽然“二元谓词”在英语中是“谓词”,但 BinaryPredicate 在英语中不是 Predicate标准版。疯狂的东西:-)
      猜你喜欢
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 2015-01-10
      • 2021-08-05
      • 2013-07-08
      • 1970-01-01
      相关资源
      最近更新 更多