2010-11-25 6 views
3

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:unordered_set des exigences TCHAR *?

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 clé spécifique (en utilisant find méthode) que je viens d'ajouter en utilisant insert il renvoie HashSet::end() !!

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

+0

Pourquoi avez-vous besoin de rejeter les consts pour '_tcscmp()'? Cela ne devrait pas être nécessaire. – Rup

+1

Devin non renseigné: 'hash <>' est un hachage de la valeur du pointeur et non de la chaîne. Mais je ne connais pas les classes TR1. – Rup

+0

@Rup: Je pensais ça mais je veux être sûr! –

Répondre

1

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 hachages sur la valeur du pointeur. Par conséquent, si vous souhaitez utiliser TCHAR* comme clé de hachage, avec le hachage basé sur le contenu de la chaîne au lieu de la valeur du pointeur, vous devez fournir une classe de hachage différente.

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 juste convertir en string ou wstring, mais si j'ai manqué quelque chose alors vous pourriez écrire un emballage simple. Si vous alliez faire l'un ou l'autre, alors vous pourriez tout aussi bien utiliser string ou wstring comme clé de hachage, puisque 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 laisser traîner jusqu'à ce qu'elles soient supprimées. Avec votre code ci-dessus, j'imagine que c'est une nuisance d'ajouter autre chose que des littéraux de chaîne à l'ensemble.

Si vous êtes préoccupé par la vitesse, et ne vous inquiétez pas de la gestion des chaînes, choisissez votre algorithme de hachage de chaînes favori et appliquez-le aux données de chaîne.

+0

Il est assez commun de typedef un 'tstring' comme un' std :: basic_string '. Cela sera égal à 'std :: string' ou' std :: wstring', et donc vous obtenez le 'hash' approprié gratuitement. – MSalters