Pregunta

Quiero estructura de datos que sirve como el uso .Net HashSet, traté de usar unordered_set con el método de hash por defecto y el comparador de encargo de la siguiente manera:

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;

El problema es cuando traté de utilizar el HashtSet encontrar tecla específica (usando el método find) que se me acaba de agregar utilizando insert vuelve HashSet::end() !!

Podría explicar cuál es el problema? Estoy usando VC ++ en VS2010

¿Fue útil?

Solución

Si se asume que hash aquí es std::hash, no hay especialización de std::hash para char* o wchar* que no sea la especialización genérico para cualquier tipo de puntero, que hash basado en el valor del puntero.

Por lo tanto, si desea utilizar TCHAR* como una clave hash, con el hash basado en el contenido de cadena en lugar del valor del puntero, que tendrá que suministrar una clase de hash funtor diferente.

Hay especializaciones de std::hash para string y wstring, que creo que se podría utilizar si tienes que elegir el más adecuado de acuerdo a _UNICODE. Digo "creo" porque TCHAR * sólo debe convertir a string o wstring, pero si me he perdido algo, entonces usted podría escribir un simple envoltorio.

Si se va a realizar una de las personas, sin embargo, a continuación, usted podría también utilizar string o wstring como la tecla de almohadilla, ya que tendrá que ser convertido para hash de todos modos todo. Esto también le permitirá añadir cadenas a su unordered_set sin tener que mantenerlos dando vueltas hasta que sean eliminados. Con el código anterior, me imagino que es una molestia que no sea la adición de cadenas literales al conjunto nada.

Si usted está preocupado acerca de la velocidad, y no está preocupado por la gestión de las cadenas, y elegir el algoritmo de hash cadena favorita y aplicarla a los datos de cadena.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top