【问题标题】:Multiple predicates specified during runtime运行时指定的多个谓词
【发布时间】:2011-10-07 10:51:25
【问题描述】:

STL 中有 less、equal_to、greater_equal 等运算符类。如何轻松地将它们与 remove_if 函数结合使用?

例如我想删除大于0且小于3且不等于2的向量元素,那么它会是这样的:

remove_if (v.begin(), v.end(), bind2nd(greater<int>(),0) + bind2nd(less<int>(),3) + not1(bind2nd(equal_to<int>(), 2)));

用户在程序运行期间可以指定过滤选项,例如他可以写:remove if x > 0 && x 5 || x == 3。然后解析命令并将适当的运算符及其参数组合到一个谓词中。

【问题讨论】:

  • Combining Predicates 的可能重复项
  • 这里有很多关于参数的静态组合,但我的意思是谓词的动态组合,比如我可以选择我想要更大+更少+等于或更大_等于+更少或只有更少等。
  • 如果我是你,我会用重载的加号运算符实现我自己的比较函数
  • 请解释“动态组合”。在您的示例中,谓词在编译时已经知道。这与“动态”相反
  • 您应该将此要求添加到问题中。这使它成为一个完全不同的问题。

标签: c++ stl functor


【解决方案1】:

实际上,这对你来说相当简单。

您首先需要解析用户给出的语句,并将其转换为 AST(抽象语法树)。事实证明,这个 AST 几乎已经很合适了。

x > 0 && x < 3 && x != 2

可以表示为一棵树:

      AND
     /   \
    >     AND
   / \   /    \
  x  0   <    !=
        / \   / \
       x   3 x   2

所有节点都应该从一个公共基类继承,并且您应该实现一个Visitor 来评估给定值的x 参数。

【讨论】:

  • “相当简单”在复杂性方面有点轻描淡写。
  • @sellibitze:相当简单的假设他已经有一些东西可以用于解析部分。如果他不这样做,那么显然会稍微复杂一些,因为生成 AST 是真正的障碍。
【解决方案2】:

我猜你所说的“动态组合”是指“组合”谓词“内联”的能力。在您的示例中,谓词在编译时是已知的,因此“动态”不是正确的术语。

考虑“Boost.Bind”。它为组合提供了运算符重载。

bind(greater<int>(),_1,0) && bind(less<int>(),_1,3) && !bind(equal_to<int>(), _1, 2)

编辑: 考虑到您对“动态组合”的解释,上面的代码不是您想要的。你需要一个表达式解析器和求值器。但这与您的实际代码示例无关。对此没有简单的解决方案。您可以尝试查看一些表达式解析器库,看看它们是否适合您的问题。

【讨论】:

  • 假设一次有 3 个谓词,另一次只有 1 个谓词,那又是什么呢?
  • 目前尚不清楚您要求的是什么。我目前的印象是您有兴趣将表达式字符串(具有运行时相关值的 std::string)转换为某个谓词。考虑用更多细节更新您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多