我的复合数据类型如下:
struct Key {
optional<int> a;
optional<int> b;
optional<int> c;
};
我还有一个多重集,multiset<Key>
。例如,它包含
{1, 2, 3}
{1, NULL, 3}
{NULL, 2, 3}
{NULL, NULL, 3}
我想让这个多重集中的所有对象与{1, 2, 3}
匹配。但有一些问题:NULL
字段应与任何内容匹配。例如,{1, 2, 3}
与{1, NULL, 3}
匹配。
我试图定义一个忽略NULL值的比较器(<
)。例如{1, NULL, NULL} == {NULL, 2, 3}
。但它不遵循弱严格排序,它给我错误的结果。
我该怎么做?
答案 0 :(得分:2)
这里的问题比不遵守弱严格排序规则更严重。你的相等甚至不是等价关系:{1,NULL,3}匹配{1,2,3}和{1,4,3},但是{1,2,3}不匹配{1,4,3}。我的结论是,您不能依赖任何标准容器来满足您的匹配要求 catch all 值。
如果您只想存储它们,则应尝试使用unordered_set
或unordered_multiset
,因为它可以让您存储值而不会出现任何问题。但是您必须手动实现一种搜索容器匹配的方法。
小心:我不建议你继承标准容器(这通常是一个错误的想法,因为它们不是为了允许派生,没有虚拟析构函数......),而是在自定义类中包含一个并将存储委托给它。