Question

Je veux utiliser la structure de données qui sert comme .Net HashSet, j'ai essayé d'utiliser unordered_set avec la méthode de hachage par défaut et comparateur personnalisé comme suit:

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;

le problème est quand j'ai essayé d'utiliser le HashtSet pour trouver la clé spécifique (en utilisant la méthode find) qui est ajouté à l'aide que je viens insert retourne HashSet::end() !!

Pouvez-vous nous expliquer quel est le problème? J'utilise VC ++ sous VS2010

Était-ce utile?

La solution

En supposant que hash ici est std::hash, il n'y a pas de spécialisation std::hash pour char* ou wchar* autre que la spécialisation générique pour tout type de pointeur, qui hash basé sur la valeur du pointeur.

Donc, si vous voulez utiliser TCHAR* comme une clé de hachage, avec le hachage en fonction du contenu de chaîne au lieu de la valeur de pointeur, vous devrez fournir une autre classe foncteur de hachage.

Il y a des spécialisations de std::hash pour string et wstring, que je pense que vous pouvez utiliser si vous choisissez la bonne selon _UNICODE. Je dis « je pense » parce que TCHAR * devrait simplement se convertir à string ou wstring, mais si je l'ai raté quelque chose, vous pourriez écrire un wrapper simple.

Si vous allez faire ou l'autre de ceux-ci, cependant, vous pourriez alors simplement utiliser aussi bien string ou wstring comme la clé de hachage, car tout devra être converti pour le hachage de toute façon. Cela vous permettra également d'ajouter des chaînes à votre unordered_set sans avoir à les garder traîner jusqu'à ce qu'ils soient retirés. Avec votre code ci-dessus, je pense que c'est une nuisance d'ajouter quoi que ce soit autre que littéraux de chaîne à l'ensemble.

Si vous êtes inquiet de la vitesse, et pas inquiet sur la gestion des chaînes, puis choisissez votre algorithme de hachage chaîne préférée et l'appliquer aux données de chaîne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top