boost::bimap 使用自定义结构作为键时发现错误条目,为什么?
boost::bimap finds wrong entry when using a custom struct as the key, why?
我有一个自定义结构,我正在使用 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,它应该只是按字典顺序比较两个操作数并且应该足以使用任意结构作为映射的键。
感谢您的帮助。
bool operator<(const S& lhs, const S& rhs) {
return std::tie(lhs.a, lhs.b) <
std::tie(lhs.a, lhs.b);
}
您为 std::tie
函数的两次调用提供了相同的参数,因此您的 operator<
总是 returns 错误。改成如下
bool operator<(const S& lhs, const S& rhs) {
return std::tie(lhs.a, lhs.b) <
std::tie(rhs.a, rhs.b);
}
我有一个自定义结构,我正在使用 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,它应该只是按字典顺序比较两个操作数并且应该足以使用任意结构作为映射的键。
感谢您的帮助。
bool operator<(const S& lhs, const S& rhs) {
return std::tie(lhs.a, lhs.b) <
std::tie(lhs.a, lhs.b);
}
您为 std::tie
函数的两次调用提供了相同的参数,因此您的 operator<
总是 returns 错误。改成如下
bool operator<(const S& lhs, const S& rhs) {
return std::tie(lhs.a, lhs.b) <
std::tie(rhs.a, rhs.b);
}