0

我有一个自定义结构,我使用 boost::bimap 映射到一些数据。不幸的是,bimap find() 没有按预期工作。下面是一个演示的最小示例:

#include <utility>
#include <boost/bimap.hpp>

struct S{
    int a;
    int b;
};
bool operator<(const S& lhs, const S& rhs) {          
    return std::tie(lhs.a, lhs.b) <
            std::tie(lhs.a, lhs.b);
}
bool operator==(const S& lhs, const S& rhs) {
   return 
        lhs.a == rhs.a &&
        lhs.b == rhs.b;
}

int main() {
    boost::bimap<S, int> bmap;

    S s0{0, 0};
    S s1{0, 1};

    bmap.left.insert(std::make_pair(s0, 0));
    bmap.left.insert(std::make_pair(s1, 1));

    auto it0 = bmap.left.find(s0);
    assert(it0 != bmap.left.end());
    auto res0_s = it0->first;
    auto res0 = it0->second;
    assert(res0_s == s0);
    assert(res0 == 0);

    auto it1 = bmap.left.find(s1);
    assert(it1 != bmap.left.end());
    auto res1_s = it1->first;
    auto res1 = it1->second;
    assert(res1_s == s1);
    assert(res1 == 1);
}

最后两个断言失败(gdb 显示 res1_s == s0)。我怀疑 operator< 的实现没有按预期工作。据我了解std :: tie,它应该只是按字典顺序比较两个操作数,并且足以使用任意结构作为映射的键。

谢谢你的帮助。

4

1 回答 1

0
bool operator<(const S& lhs, const S& rhs) {          
    return std::tie(lhs.a, lhs.b) <
           std::tie(lhs.a, lhs.b);
}

您为两个std::tie函数调用提供了相同的参数,因此您operator<始终返回 false。将其更改为以下。

bool operator<(const S& lhs, const S& rhs) {          
    return std::tie(lhs.a, lhs.b) <
           std::tie(rhs.a, rhs.b);
}
于 2020-04-06T09:57:40.093 回答