c++ - 在运行时指定的多个谓词

标签 c++ stl functor

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

例如,我想删除 vector 中大于 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 < 3 && x != 2,或者他可以写:remove if x > 5 || x == 3。然后解析命令,并将适当的运算符及其参数组合在一起成为一个谓词。

最佳答案

实际上,这在您的情况下相当简单。

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

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

可以表示为一棵树:

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

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

关于c++ - 在运行时指定的多个谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7686245/

相关文章:

c++ - std::vector<char> 中元素的字节对齐方式是什么?

go - 在泛型 go 中模拟方法类型参数

c++ - 不同功能的容器?

c++ - 我将如何创建一个函数来确定用户输入是否是 vector 中包含的单词之一

c++ - 整齐地约束 API 模板类型

c++ - 为什么在访问元素之前在容器上使用 std::forward?

c++ - std::equal 与 reverse_iterator

c++ - Curiously Recurring Template Pattern (CRTP)、AutoLists 和 C++

c++ - 将对象 vector 写入文件

c++ - 既然可以使用函数引用,为什么还要使用仿函数