2011-02-02 9 views
16

Mi código:par <int,int> par como la clave de emisión unordered_map

typedef pair<int,int> Pair 
    tr1::unordered_map<Pair,bool> h; 
    h.insert(make_pair(Pair(0,0),true)); 

erorr

undefined reference to `std::tr1::hash<std::pair<int, int> >::operator()(std::pair<int, int>) const' 

Algo tengo que arreglar?

gracias

Respuesta

23

Esto ocurre porque no hay una especialización para std::tr1::hash<Key> con Key = std::pair<int, int>. Debe especializar std::tr1::hash<Key> con Key = std::pair<int, int> antes de declarar tr1::unordered_map<Pair,bool> h;. Esto sucede porque std no sé cómo hash pair<int, int>.

A continuación hay un ejemplo de cómo especializarse std::tr1::hash<>

template <> 
struct std::tr1::hash<std::pair<int, int> > { 
public: 
     size_t operator()(std::pair<int, int> x) const throw() { 
      size_t h = SOMETHING;//something with x 
      return h; 
     } 
}; 
+0

+1, un ' unordered_map' es una tabla hash. – vz0

+15

Lo cual es desafortunado, porque si lo especializo para utilizarlo en mi biblioteca, y lo especializas para usarlo en tu biblioteca, y nuestras definiciones no son idénticas, entonces cuando nuestras bibliotecas están vinculadas, obtenemos un comportamiento indefinido. 'std :: tr1 :: hash' es un poco infraespecificado, es mejor si es posible especificar una clase Hash personalizada para el' desorden_map' en su lugar, como el tercer parámetro de plantilla. –

+1

@Steve: sin dolor, sin ganancia :) –

0

se encontró con el mismo problema:

unordered_map <pair<x, y>, z> m1; 

algunas soluciones son:

unordered_map <stringxy, z> m1; 
// the first and second of the pair merged to a string 
// though string parsing may be required, looks same complexity overall 

unordered_multimap <x, pair<y, z>> m1; 
// second of the pair of the key went into value. 
// time complexity slightly increases 

deque<deque<x>> d1; 
// here x & y are of same type, z is stored as: d1[x][y] = z 
// space required is x * y, however time complexity is O(1) 
Cuestiones relacionadas