【问题标题】:Templates, and C++ operator for logic: B contained by set A用于逻辑的模板和 C++ 运算符:集合 A 包含的 B
【发布时间】:2010-04-07 00:37:47
【问题描述】:

在 C++ 中,我希望实现一个运算符,用于根据 B 完全包含在 A 中来选择列表(B 类型)中的项目。

在 Montgomery Phister jr 的《数字计算机的逻辑设计》一书中(1958 年出版),第 54 页,它说:

F11 = A + ~B 有两个有趣且有用的关联,它们都与计算机设计无关。第一个是蕴涵的逻辑符号……第二个是包含符号……这可以用一个熟悉的关系来表达,B

我最初的实现是在 C 中。回调被赋予列表以用于此类操作。一个示例是一个整数列表,以及一个包含两个整数 min 和 max 的结构,用于选择目的。

在那里,选择将基于 B >= A->min && B max。

使用 C++ 和模板,在使用 void 指针和回调在 C 中实现通用列表后,您将如何处理这个问题?

是否使用 邪恶?

(或者通过使用B类作为选择标准,通过重载实现比较>?)

编辑:我对列表节点的实现包含一个用于标记项目选择的成员。

关于集合和唯一性,列表中的数据可能会包含一个成员指定沿时间线的位置,因为这是主要选择标准之一,使用术语集合可能会产生误导,因为没有保证沿时间线位置的唯一性——即事件可以同时发生。

【问题讨论】:

    标签: c++ templates logic overloading inclusion


    【解决方案1】:

    在标准库中到处都是这样做的方式是两个有一个模板参数,可以接受一个函数/仿函数并用于比较:

    template<typename Predicate>
    void container::select(Predicate p) {
       if (p(items[0])) {
         // something
       }
    }
    

    标准库中的一些示例是remove_iflower_bound

    (还要注意标准库中已经有一个set 类模板,以及set_intersection 之类的算法)

    【讨论】:

    • +1 表示 set_intersection。标准库的算法经常被忽略,但通常有一种非常适合您想要完成的任务。
    • 在这种情况下,也许我对术语集的使用是错误的,列表不一定包含唯一项目(唯一性取决于所选择的内容)。
    • 因提及函子而被接受 - 仍在考虑函数指针。
    【解决方案2】:

    IMO,使用 '

    在这种情况下,我会在 STL 之后为我的实现建模。我不确定这正是您所追求的,并且未经测试,但是:

    编辑:编译和测试:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <iterator>
    #include <functional>
    #include <ext/functional>
    
    using namespace std;
    using __gnu_cxx::compose2;
    
    int main(int argc, char** argv) {
      vector<int> list_of_b;
      vector<int> included_in_a;
    
      int min = 2;
      int max = 5;
      remove_copy_if(list_of_b.begin(), list_of_b.end(),
                     back_inserter(included_in_a),
                     not1(compose2(logical_and<bool>(),
                                   bind2nd(greater<int>(), min),
                                   bind2nd(less<int>(), max))));
      copy(included_in_a.begin(), included_in_a.end(),
           ostream_iterator<int>(cout, "\n"));
      return 0;
    }
    

    【讨论】:

    • 这不是我想要的,但是我没有提到我用于列表中节点的类有一个成员来标记是否选择了一个项目(即你可以选择项目而不删除它们)。
    猜你喜欢
    • 2011-03-28
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2023-02-23
    • 2012-11-17
    • 1970-01-01
    相关资源
    最近更新 更多