The following program does not compile an unordered set of pairs of integers, but it does for integers. Can unordered_set
and its member functions be used on user-defined types, and how can I define it?
#include <unordered_set>
...
class A{
...
private:
std::unordered_set< std::pair<int, int> > u_edge_;
};
Compiler error:
error: no matching function for call to 'std::unordered_set >::unordered_set()'
Your code compiles on VS2010 SP1 (VC10), but it fails to compile with GCC g++ 4.7.2.
However, you may want to consider
boost::hash
from Boost.Functional to hash astd::pair
(with this addition, your code compiles also with g++).You are missing a hash function for
std::pair<int, int>>
. For example,You can also specialize
std::hash<T>
forstd::hash<std::pair<int,int>>
, in which case you can omit the second template parameter.OK here is a simple solution with guaranteed non collisions. Simply reduce your problem to an existing solution i.e. convert your pair of
int
tostring
like so:Enjoy!
As already mentioned in most of the other answers on this question, you need to provide a hash function for
std::pair<int, int>
. However, since C++11, you can also use a lambda expression instead of defining a hash function. The following code takes the solution given by dasblinkenlight as basis:Code on Ideone
I'd like repeat dasblinkenlight's disclaimer: This solution is limited to a pair of two integers. This answer provides the idea for a more general solution.
There is no standard way of computing a hash on a pair. Add this definition to your file:
Now you can use it like this:
This works, because
pair<T1,T2>
defines equality. For custom classes that do not provide a way to test equality you may need to provide a separate function to test if two instances are equal to each other.Of course this solution is limited to a pair of two integers. Here is a link to an answer that helps you define a more general way of making hash for multiple objects.
You need to provide a specialization for
std::hash<>
that works withstd::pair<int, int>
. Here is a very simple example of how you could define the specialization: