2016-05-06 6 views
0

Point ist eine Struktur der Form:C++ arbeiten mit Karten von structs

typedef struct Point { 
    int x; 
    int y; 
    bool operator<(const Point &other) const 
    { 
     return ((this->x < other.x) && (this->y < other.y)); 
    }; 
    bool operator!=(const Point &other) const 
    { 
     return ((this->x != other.x) || (this->y != other.y)); 
    } 
    bool operator==(const Point &other) const 
    { 
     return ((this->x == other.x) && (this->y == other.y)); 
    } 
} Point; 

und ich bin mit:

map<Point,int> points; 

die Karte mit {{0,0} initialisiert, 1 }. und das Programm hat points.count (p) verwendet, um zu überprüfen, ob der Punkt p ein Schlüssel in der Punktekarte ist.
Es gibt ein Problem und das Programm gibt immer ja zurück! sogar für Punkte, die nicht in der Karte sind. Ich meine, wenn p kein Schlüssel in Punkten ist, bekomme ich points.count (p) == 1 (und nicht 0).
Wenn ich points.find (p) verwende, um den Iterator zu überprüfen, ob der empfangene Punkt wirklich == 0 ist (es ist nicht), bekomme ich einen Verweis auf einen ganz anderen Punkt.
Irgendeine Idee Wie behebe ich das Problem?

+1

Ihr 'Operator <' definiert nicht ein [* Strikte schwache Ordnung *] (https : //www.sgi.com/tech/stl/StrictWeakOrdering.html). – BoBTFish

+0

Sie haben Recht, wenn ich Punkte mit Point = {0,0} und int = 1 initialisiere; Ich bekomme, dass {1,1} kein Schlüssel ist, während {0,1} ist .. wie repariere ich das ?. Edit: @BoBTFish hey Ich habe deinen Link verpasst, jetzt überprüfe ich das – Jayn

+1

[Diese Frage hat Antworten für 3 Punkte] (http://stackoverflow.com/q/979759/1171191). – BoBTFish

Antwort

1

Ihre operator<() ist schlecht definiert. Angenommen, ich habe a=Point{0,1} und b=Point{1,1}. Dann ist weder a<b noch b<a noch a==b wahr, was den Bediener nicht zu einer Bestellung auf der Menge der möglichen Punkte macht. Um dies Sie zu korrigieren müssen eine der Dimensionen (zB x) die ‚große‘ Dimension im Vergleich zu machen:

bool operator<(const Point &other) const 
{ 
    return ((this->x < other.x) || 
      ((this->x == other.x) && (this->y < other.y)); 
};