Frage

Ich möchte Verwendung Datenstruktur, die wie .Net HashSet dient, habe ich versucht unordered_set mit dem Standard-Hash-Verfahren und benutzerdefinierte Vergleich wie folgt zu verwenden:

struct comparer
    {
        bool operator()( const TCHAR* first,const TCHAR* second) const
        {   
            return _tcscmp((TCHAR*)first,(TCHAR*)second) == 0;
        }
    };

    typedef unordered_set<const TCHAR*,hash<const TCHAR*>,comparer> HashSet;

das Problem ist, wenn ich versuchte, die HashtSet zu verwenden, um bestimmte Schlüssel (mit find-Methode) zu finden, dass ich mit nur hinzugefügt ist insert es gibt HashSet::end() !!

Könnten Sie erklären, was ist das Problem? Ich bin mit VC ++ unter VS2010

War es hilfreich?

Lösung

Unter der Annahme, dass hash hier ist std::hash, gibt es keine Spezialisierung von std::hash für char* oder wchar* andere als die generische Spezialisierung für jeden Zeigertyp, dass Hashes basierend auf dem Zeigerwert.

Wenn Sie also TCHAR* als Hash-Schlüssel, mit dem Hash verwendet werden soll, basierend auf den String Inhalt anstelle des Zeigerwert, müssen Sie einen anderen Hash Funktor Klasse liefern.

Es gibt Spezialisierungen von std::hash für string und wstring, dass ich glaube, Sie könnten, wenn Sie die richtige wählen nach _UNICODE. Ich sage: „Ich denke“, weil TCHAR * sollte nur auf string oder wstring konvertieren, aber wenn ich etwas verpasst haben, dann können Sie einen einfachen Wrapper schreiben.

Wenn Sie würden entweder von denen zu tun, aber dann könnte man einfach auch string oder wstring als Hash-Schlüssel verwenden, da alles was Sie brauchen sowieso für Hashing umgewandelt werden. Dies ermöglicht es Ihnen auch Strings Ihre unordered_set hinzuzufügen, ohne sie herum hängen halten zu müssen, bis sie entfernt sind. Mit Ihrem Code oben, ich denke, es ist ein Ärgernis etwas hinzuzufügen andere als Stringliterale auf den Satz.

Wenn Sie über die Geschwindigkeit besorgt sind, und besorgt nicht über die Saiten der Verwaltung, dann Ihre Lieblings String Hashing-Algorithmus auswählen und es in die String-Daten gelten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top