逻辑的模板和C ++运算符:集合A包含的B.

时间:2010-04-07 00:37:48

标签: c++ templates logic overloading inclusion

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

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

F11 = A + ~B有两个有趣且有用的关联,它们都与计算机设计无关。第一个是暗示的逻辑符号......第二个是包含的符号......这可以用熟悉的关系表示,B<一个;或声明“B包括在A中”;或者通过布尔方程F11 = A + ~B = 1。

我的初始实现是在C.回调被提供给列表以用于此类操作。一个示例是一个int列表,一个包含两个int,min和max的结构,用于选择目的。

在那里,选择将基于B&gt; = A-&gt; min&amp;&amp; B <= A->最大

使用C ++和模板,在使用void指针和回调在C中实现泛型列表后,如何处理?

正在使用&lt;作为这种目的的过度运营商...&lt; ugh&gt;邪恶? &LT; /啊&GT;

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

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

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

2 个答案:

答案 0 :(得分:3)

这在标准库中的所有地方完成的方式是两个有模板化参数,可以使用函数/函子并用于比较:

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

标准库中的一些示例包括remove_iflower_bound

(另请注意标准库中已有set类模板,以及set_intersection等算法

答案 1 :(得分:0)

IMO,使用'&lt;'会是邪恶的。如果不计算“小于”,则可能是滥用。

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

编辑:编译&amp;测试:

#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;
}