0

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

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

F11 = A + ~B 有两个有趣且有用的关联,它们都与计算机设计无关。第一个是蕴涵的逻辑符号……第二个是包含符号……这可以用一个熟悉的关系来表达,B < A; 或由“B包含在A中”的陈述;或通过布尔方程 F11= A + ~B = 1。

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

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

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

是否出于此类目的使用 < 作为重载运算符... <ugh> 邪恶?</ug>

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

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

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

4

2 回答 2

3

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

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

标准库中的一些示例将remove_iflower_bound.

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

于 2010-04-07T00:56:05.427 回答
0

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;
}
于 2010-04-07T01:01:39.320 回答