我有一个名为 foo 的结构体,还有一个名为 mp 的映射,但由于某种原因,当我插入 {5, 0, 3} 并查询 {5, 3, 0} 时,映射显示它包含 {5, 3, 0} 但实际上没有:
#include <bits/stdc++.h>
using namespace std;
struct foo {
int v1, v2, v3;
friend bool operator<(const foo &a, const foo &b) {
return a.v1 < b.v1;
}
friend bool operator==(const foo &a, const foo &b) {
return (a.v1 == b.v1) && (a.v2 == b.v2) && (a.v3 == b.v3);
}
};
int main() {
map<foo, int> mp;
mp[{5, 0, 3}] = 1;
if(mp[{5, 3, 0}]) {
cout << "YES\n";
} else {
cout << "NO\n";
}
return 0;
}
输出:
YES
有谁知道为什么我的代码会这样做?如果是这样,我需要改变什么?
您的比较运算符与您的相等运算符不匹配。 A
std::map
不使用相等运算符;它使用“小于”。如果 a < b
和 b < a
都不是,则地图认为 a
和 b
等效。对于你的情况:
foo{5, 0, 3} < foo{5, 3, 0}
是 false
因为 5 < 5
是假的。foo{5, 3, 0} < foo{5, 0, 3}
是 false
因为 5 < 5
是假的。因此地图认为这些对象是等价的。所以
mp[{5, 3, 0}]
找到你刚刚设置为1的地图元素,因此它是一个真值。
为了获得您想要的结果,您的
operator<
需要考虑所有三个成员,而不仅仅是 v1
。