Unordered-MultiMap of Pairs

ぐ巨炮叔叔 提交于 2019-12-13 04:51:21

问题


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)


回答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.



来源:https://stackoverflow.com/questions/20208498/unordered-multimap-of-pairs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!