Domanda

Voglio struttura di dati utilizzo che serve come Net HashSet, ho cercato di usare unordered_set con il metodo predefinito di hashing e di confronto personalizzato come segue:

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;

il problema è quando ho provato ad usare il HashtSet per trovare la chiave specifica (utilizzando il metodo find) che è ho solo aggiunto utilizzando insert restituisce HashSet::end() !!

Ci può spiegare qual è il problema? Sto usando VC ++ in VS2010

È stato utile?

Soluzione

Supponendo che hash qui è std::hash, non v'è alcuna specializzazione delle std::hash per char* o wchar* diversa specializzazione generico per qualsiasi tipo di puntatore, che hash basato sul valore del puntatore.

Quindi, se si desidera utilizzare TCHAR* come una chiave hash, con l'hash in base al contenuto della stringa invece che il valore del puntatore, avrete bisogno di fornire una diversa classe di hash functor.

Ci sono specializzazioni di std::hash per string e wstring, che penso che si potrebbe usare se si sceglie quello giusto in base al _UNICODE. Dico "Credo", perché TCHAR * deve solo convertire string o wstring, ma se ho perso qualcosa, allora si potrebbe scrivere un semplice involucro.

Se si dovesse andare a fare uno di questi, però, allora si potrebbe altrettanto bene usare string o wstring come il tasto cancelletto, dal momento che tutto dovrà essere convertito per l'hashing in ogni caso. Questo permetterà anche di aggiungere le stringhe al tuo unordered_set senza dover per tenerli in giro fino a quando sono stati rimossi. Con il vostro codice di cui sopra, immagino che sia un fastidio l'aggiunta di qualcosa di diverso da stringhe letterali al set.

Se siete preoccupati per la velocità, e non sono preoccupato per la gestione delle stringhe, poi scegliere l'algoritmo di hashing stringa preferito e applicarlo ai dati stringa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top