我有点疑惑,为什么以下代码没有按预期工作......
#include <iostream>
#include <map>
struct Foo {
int x,y,z;
Foo(int x,int y,int z) : x(x),y(y),z(z) {}
bool operator<(const Foo& other) const {
if (x > other.x) return false;
if (y > other.y) return false;
if (z > other.z) return false;
return true;
}
bool operator==(const Foo& other) const {
if (other.x != x) return false;
if (other.y != y) return false;
if (other.z != z) return false;
return true;
}
};
int main() {
Foo f(1,2,3);
std::map<Foo,double> map;
map[f] = 1.0;
std::cout << map[f] << "\n";
}
它会打印0
而不是1
。我做错了什么?
答案 0 :(得分:8)
这是因为您的Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, : java.lang.OutOfMemoryError: GC overhead limit exceeded
已被错误地实施。这是正确的版本:
operator<
基本上说如果bool operator<(const Foo& other) const {
if (x != other.x) return x < other.x;
else if (y != other.y) return y < other.y;
return z < other.z;
}
相等,那么比较x
,如果它太等于,则比较y
。
更短的实施可能是这样的:
z
希望有所帮助。
答案 1 :(得分:4)
Foo::operator <
未定义std::map
所需的strict weak ordering
特别是,给定两个相同的Foo
s a
和b
,a < b
和b < a
都是正确的,它们都应该是假的。
由于您违反了std::map
的合同,行为未定义。