Inserción en unordered_set con función hash personalizada

Tengo el siguiente código para hacer un unordered_set . Esto comstack bien.

 struct Interval { unsigned int begin; unsigned int end; bool updated; //true if concat. initially false int patternIndex; //pattern index. valid for single pattern int proteinIndex; //protein index. for retrieving the pattern }; struct Hash { size_t operator()(const Interval &interval); }; size_t Hash::operator()(const Interval &interval){ string temp = to_string(interval.begin) + to_string(interval.end) + to_string(interval.proteinIndex); return hash()(temp); } unordered_set test; 

Sin embargo, no puedo comstackr cuando trato de insertar usando este código:

  for(list::iterator i = concat.begin(); i != concat.end(); ++i){ test.insert((*i)); } 

Además, no puedo determinar cuál es el problema de los mensajes de error.

Aquí hay una muestra:

 note: candidate is: note: size_t Hash::operator()(const Interval&) note: candidate expects 1 argument, 2 provided 

Pensé que solo proporcioné 1 argumento …

¿Alguien ve un problema con mi código de inserción? Por favor ayuda, si puedes, he estado buscando una solución desde hace bastante tiempo.

EDITAR:

Aquí está el nuevo código de instanciación: unordered_set test; Sin embargo, sigo recibiendo una gran cantidad de mensajes de error. Ex:

 note: candidate is: note: size_t Hash::operator()(const Interval&)  note: no known conversion for implicit 'this' parameter from 'const Hash*' to 'Hash*' 

Primer problema:

Está pasando string como el segundo argumento de plantilla para su instanciación de la plantilla de clase unordered_set<> . El segundo argumento debería ser el tipo de su functor hasher , y std::string no es un objeto invocable.

Tal vez significó escribir:

 unordered_set test; // ^^^^^^^^^^^^ // Why this? 

Además, sugeriría usar nombres que no sean begin y end para sus variables (miembros), ya que esos son nombres de algoritmos de la Biblioteca Estándar de C ++.

Segundo problema:

Debe tener en cuenta que la función hasher debe calificarse como const , por lo que su functor debería ser:

 struct Hash { size_t operator() (const Interval &interval) const { // ^^^^^ // Don't forget this! string temp = to_string(interval.b) + to_string(interval.e) + to_string(interval.proteinIndex); return (temp.length()); } }; 

Tercer problema:

Finalmente, si quiere que std::unordered_set pueda trabajar con objetos de tipo Interval , necesita definir un operador de igualdad consistente con su función hash. De forma predeterminada, si no especifica ningún argumento de tipo como el tercer parámetro de la plantilla de clase std::unordered_set , se usará operator == .

Actualmente no tiene una sobrecarga de operator == para su clase de Interval , por lo que debe proporcionar uno. Por ejemplo:

 inline bool operator == (Interval const& lhs, Interval const& rhs) { return (lhs.b == rhs.b) && (lhs.e == rhs.e) && (lhs.proteinIndex == rhs.proteinIndex); } 

Conclusión:

Después de todas las modificaciones anteriores, puede ver su código comstackndo en este ejemplo en vivo .