这张地图有什么问题?

时间:2017-02-03 16:05:31

标签: c++ stdmap

我有点疑惑,为什么以下代码没有按预期工作......

#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。我做错了什么?

代码也在这里:http://ideone.com/fork/HMwPQ7

2 个答案:

答案 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

了解Strict Weak Ordering

更短的实施可能是这样的:

z

希望有所帮助。

答案 1 :(得分:4)

Foo::operator <未定义std::map所需的strict weak ordering 特别是,给定两个相同的Foo s aba < bb < a都是正确的,它们都应该是假的。
由于您违反了std::map的合同,行为未定义。