带有自定义键的多图 - 比较功能

Yog*_*shi 0 c++ iterator multimap comparison-operators

bool operator<(const Binding& b1, const Binding& b2)
{
    if(b1.r != b2.r && b1.t1 != b2.t1)
    {
        if(b1.r != b2.r)
            return b1.r < b2.r;
        return b1.t1 < b2.t1;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

我有一个像上面这样的比较函数.基本上,如果其中一个属性匹配,我需要认为对象是相等的.我正在为我的multimap使用这个比较函数,其关键是'Binding'对象.我面临的问题是lower_bound和upper_bound函数返回指向有效对象的相同迭代器.例如(t1 = 1,r = 2)已经在地图中,当我尝试在地图中用(t1 = 1,r = 2)搜索它时,我获得与upper_bound和lower_bound函数的返回值相同的迭代器.

比较功能有什么问题吗?有没有办法计算一个函数,即使只有一个字段匹配,我仍然可以确保对象是等价的?upper_bound迭代器不应该返回通过的对象

Arn*_*rtz 5

期望地图或多图的比较器在该组键之间表达严格的弱排序关系.您的要求"如果只有一个字段匹配,则两个对象是等效的"不能是这样的关系.拿这三个键:

1: r=1, t1=10
2: r=1, t1=42
3: r=2, t1=42
Run Code Online (Sandbox Code Playgroud)

显然,键1和键2是等价的,因为它们具有相同的功能r.同样,2和3是相同的,因为它们是相同的t1.这意味着,1和3也必须是等价的,尽管它们没有匹配的字段.

作为必然结果,在这些情况下,所有可能的密钥都必须是等价的,这意味着您根本没有任何排序,并且多图不是正确的方法.

对于您的情况,我想到了Boost.MultiIndex.然后,您可以为rt1执行两个单独的索引lower_bound,upper_bound并分别equal_range搜索两个索引.