2015-10-10 173 views
2

我有这样一个复合数据类型:“不关心”领域

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}。我的结论是,你不能依赖任何标准容器来满足你的匹配要求,捕获所有的值。

如果你只是想存储它们,你应该尝试使用unordered_setunordered_multiset,因为它可以让你存储的值没有任何问题。但是你将不得不手动实现一个搜索容器匹配的方法。

当心:我不建议你继承一个标准集装箱(它通常是一个错误的想法,因为他们没有被设计成允许推导,有没有虚析构函数...),而是包括一个在自定义类和委托存储。