0

I'm struggling to efficiently store information in pairs:

For instance I have two structs that represent (x,y) coords that i wish to calculate and store the distance between. Currently I am store all the values twice in a

unordered_map<pair<Struct1*,Struct2*,double>

My problem is that when searching I want the result <Struct1*,Struct2*> to turn up the same value as <Struct2*,Struct1*> that way I do not have to store information twice. I've thought about using a multimap but I think that std::hash<pair<pointer1,pointer2>> will hash to the same value as pair<pointer2,pointer1> any suggestions on how to do this?

Edit:

I've thought about doing a customer hash that simply adds the two hash values of the pointers using std::hash like:

size_t operator() (const pair<Location*,Location*> &key) { hash<Location*> hash1; return (hash1(key.first) + hash1(key.second)); }

this works when I call find(struct1,struct2), however not when i call find(struct2,struct1)

GoBlue_MathMan
  • 1,048
  • 2
  • 13
  • 20

1 Answers1

1

unordered_map does not only use the hash to identify a key, it also uses a comparison operator :

template<
    class Key,
    class T,
    class Hash = std::hash<Key>,
    class KeyEqual = std::equal_to<Key>,
    class Allocator = std::allocator< std::pair<const Key, T> >
> class unordered_map;

It is the KeyEqual parameter which by default calls std::equal_to which by default calls operator==.

To do what you want, you can replace the KeyEqual parameter whith a custom one that when given a pair<struct1*, Struct2*> and a pair<struct2*, struct 1*> will return true independently of the order.

Drax
  • 12,682
  • 7
  • 45
  • 85
  • I'm getting complier errors my declaration looks like this: `unordered_map,int,std::hash>,my_hash_pred> dist;` where my my_hash_pred just returns true if the two pairs are equal, complier errors have to do with std::hash – GoBlue_MathMan Nov 26 '13 at 13:10