【问题标题】:"Don't Care" fields in multiset keys多集键中的“无关”字段
【发布时间】:2016-01-08 05:06:02
【问题描述】:

我有一个复合数据类型,例如:

struct Key {
    optional<int> a;
    optional<int> b;
    optional<int> c;
};

我还有一个多重集,multiset&lt;Key&gt;。例如,它包含

{1, 2, 3}
{1, NULL, 3}
{NULL, 2, 3}
{NULL, NULL, 3}

我想获取此多重集中与{1, 2, 3} 匹配的所有对象。但是有一个问题:NULL 字段应该与任何内容匹配。例如,{1, 2, 3}{1, NULL, 3} 匹配。

我试图定义一个忽略 NULL 值的比较器 (&lt;)。例如{1, NULL, NULL} == {NULL, 2, 3}。但它不遵循 weak strict order,它给了我错误的结果。

我该怎么做?

【问题讨论】:

  • 你不能。在最坏的情况下,您必须获取所有元素。不妨将键存储在向量中并尝试匹配每个键。

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


【解决方案1】:

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

如果您只想存储它们,您应该尝试使用unordered_setunordered_multiset,因为它可以让您毫无问题地存储值。但是您必须手动实现一种方法来搜索容器以查找匹配项。

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

【讨论】:

    猜你喜欢
    • 2017-09-21
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 2021-10-26
    相关资源
    最近更新 更多