多字符键中的“不关心”字段

时间:2015-10-10 08:37:12

标签: c++ c++11 dictionary multimap multiset

我的复合数据类型如下:

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}。但它不遵循弱严格排序,它给我错误的结果。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

这里的问题比不遵守弱严格排序规则更严重。你的相等甚至不是等价关系:{1,NULL,3}匹配{1,2,3}和{1,4,3},但是{1,2,3}不匹配{1,4,3}。我的结论是,您不能依赖任何标准容器来满足您的匹配要求 catch all 值。

如果您只想存储它们,则应尝试使用unordered_setunordered_multiset,因为它可以让您存储值而不会出现任何问题。但是您必须手动实现一种搜索容器匹配的方法。

小心:我不建议你继承标准容器(这通常是一个错误的想法,因为它们不是为了允许派生,没有虚拟析构函数......),而是在自定义类中包含一个并将存储委托给它。