I have:
struct Coord { int row, col ; bool operator<( const Coord& other ) const { return row < other.row && col < other.col ; } } ;
I'm trying to create a map<Coord, Node*>
, where you can look up a Node*
by Coord
.
The problem is, it has bugs. Lookups into the map<Coord, Node*>
by Coord
are returning the wrong ones.
I'm having difficulty figuring out if this is appropriate or not.
Wikipedia says, map [keys] requires a strict weak ordering. Have I done this wrong? Is there a way to make it work, or should keys for a map be simple values that can be "strictly ordered"?
Basically the question is what is required for a custom struct
to work as a key for my std::map?
Best Answer
Yes you could very well have a problem with strict-weak ordering. Odds are its not working like you'd expect. Consider:
obj1 (this) row: 2 col: 3
obj2 row: 3 col: 2
obj1 < obj2? => false
ok well then:
obj2 < obj1? => false
The only conclusion is that they must be equal (based on your < operator). Since this is a map, and keys are unique, both keys reselve to the same spot. This behavior may-or-may not be what you expect, but it sounds like it probably isn't.
What you need is to make a precedence between row/col so that < really works like you'd expect: