在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;实现比较?)
编辑:我对列表节点的实现包含一个标记项目选择的成员。
关于集合和唯一性,列表中的数据可能包含指定沿时间线的位置的成员,因为这是主要选择标准之一,使用术语集可能会产生误导,因为没有保证关于沿时间线的位置的唯一性 - 即事件可以同时发生。
答案 0 :(得分:3)
这在标准库中的所有地方完成的方式是两个有模板化参数,可以使用函数/函子并用于比较:
template<typename Predicate>
void container::select(Predicate p) {
if (p(items[0])) {
// something
}
}
标准库中的一些示例包括remove_if
或lower_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;
}