多集键中的"Don't Care"字段

"Don't Care" fields in multiset keys

本文关键字:字段 Care Don      更新时间:2023-10-16

我有一个复合数据类型:

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,NULL,3}匹配{1,2,3}和{1,4,3},但是{1,2,3}不匹配{1,4,3}。我的结论是,您不能依赖任何标准容器来满足捕获所有值的匹配要求。

如果您只想存储它们,您应该尝试使用unordered_setunordered_multiset,因为它将允许您存储值而没有任何问题。但是您必须手动实现一个方法来搜索容器中的匹配项。

注意:我不建议您创建标准容器的子类(这通常是一个错误的想法,因为它们的设计不允许派生,没有虚析构函数…),而是在自定义类中包含一个,并将存储委托给它。