Einsetzen in unordered_set mit custom-hash-Funktion
Ich habe den folgenden code, um eine unordered_set<Interval>
. Dies stellt in Ordnung.
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<string>()(temp);
}
unordered_set<Interval, string, Hash> test;
Aber ich kann nicht kompiliert wenn ich versuche, einfügen mit diesem code:
for(list<Interval>::iterator i = concat.begin(); i != concat.end(); ++i){
test.insert((*i));
}
Außerdem kann ich nicht feststellen, was das problem ist aus den Fehlermeldungen.
Hier ist ein Beispiel:
note: candidate is:
note: size_t Hash::operator()(const Interval&)
note: candidate expects 1 argument, 2 provided
Dachte ich, dass ich nur 1 argument...
Erkennt jemand ein problem mit meinem code einfügen? Bitte helfen Sie, wenn Sie können - ich habe auf der Suche nach einer Lösung für eine ganze Weile jetzt.
EDIT:
Hier ist die neue Instanziierung code: unordered_set<Interval, Hash> test;
Ich bin aber immer noch erhalten eine Reihe von Fehlermeldungen. Ex:
note: candidate is:
note: size_t Hash::operator()(const Interval&) <near match>
note: no known conversion for implicit ‘this’ parameter from ‘const Hash*’ to ‘Hash*’
InformationsquelleAutor der Frage user2052561 | 2013-04-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste problem:
Übergeben Sie
string
als zweites template-argument für Ihre Instanziierung derunordered_set<>
Klasse Vorlage. Das zweite argument sollte sein, die Art Ihres hasher Funktorundstd::string
ist nicht ein callable-Objekt.Vielleicht gedacht zu schreiben:
Außerdem würde ich empfehlen, einen anderen Namen als
begin
undend
für Ihr (member) Variablen, da die Namen der algorithmen der C++ - Standard-Bibliothek.Zweite problem:
Sollten Sie im Hinterkopf behalten, dass die hasher Funktion qualifiziert werden sollten, als
const
so dass Ihre functor sollten:Dritte problem:
Schließlich, wenn Sie wollen
std::unordered_set
in der Lage sein, um die Arbeit mit Objekten vom TypInterval
müssen Sie definieren, ein Gleichheits-operator im Einklang mit Ihrer hash-Funktion. Standardmäßig wird, wenn Sie nicht angeben, eine Art argument als Dritter parameter derstd::unordered_set
Klasse Vorlageoperator ==
verwendet werden.Sie derzeit nicht über eine überlastung der
operator ==
für Ihre KlasseInterval
so sollten Sie einen zur Verfügung stellen. Zum Beispiel:Fazit:
Nachdem alle oben genannten änderungen, können Sie Ihren code kompilieren in diesem live-Beispiel.
InformationsquelleAutor der Antwort Andy Prowl