2010-02-01 27 views
43

No sé cómo utilizar la función de hash en C++, pero sé que podemos utilizar hash_map. ¿G ++ admite eso simplemente incluyendo #include <hash_map>? ¿Qué es un ejemplo simple usando hash_map?Me gustaría ver un ejemplo en C++ hash_map

+8

@BlueRaja: Sí, por supuesto, el uso de las que conduce a tal confusión maravilloso como la gente creer que 'hash_map' es en realidad parte de C++. Creo que esto, como cualquier otra pregunta relacionada con la programación, está en casa aquí en SO, ¿no? Decirle a la gente que use Google es una pérdida de ellos y de nuestro tiempo. La suya porque tienen que examinar miles de respuestas inexactas y poco confiables, y la nuestra porque tenemos que derribar todos sus conceptos erróneos y malas prácticas cuando vienen aquí para hacer preguntas más adelante. – jalf

+1

@jalf: como si las respuestas en SO estuvieran garantizadas de alguna manera como precisas y confiables. –

+11

Están garantizados para ser vistos y votados por otros programadores, lo que las convierte en un infierno de mucho más confiable que la mayor parte de lo que un principiante puede encontrar ciegamente la búsqueda en Google. – jalf

Respuesta

50

El actual estándar de C++ no tiene mapas de hash, pero el próximo estándar de C++ 0x hace, y estos ya son compatibles con g ++ en forma de "mapas desordenadas":

#include <unordered_map> 
#include <iostream> 
#include <string> 
using namespace std; 

int main() { 
    unordered_map <string, int> m; 
    m["foo"] = 42; 
    cout << m["foo"] << endl; 
} 

Con el fin para obtener esta compilación, es necesario contar g ++ que está utilizando C++ 0x:

g++ -std=c++0x main.cpp 

Estos mapas funcionan más o menos como std :: mapa hace, excepto que en lugar de proporcionar una costumbre operator<() para sus propios tipos , debe proporcionar una función hash personalizada - suitab Las funciones se proporcionan para tipos como enteros y cadenas.

+0

+1: debe editar esa respuesta para mencionar TR1 aunque ... –

+1

@Kornel No, no debería. TR1 nunca fue ratificado: el espacio de nombres tr1 es solo una extensión que proporciona un compilador. Nunca lo uso en mi propio código. –

+0

@Neil, muuuy, una persona usando GCC 3.4, MSVC y otros no-C++ 0x compiladores no deben usar TR1, pero gratiously esperar hasta que las extensiones de la biblioteca C++ 0x son compatibles fuera de la caja? –

9

#include <tr1/unordered_map> obtendrá la siguiente norma C++ unique hash container. Uso:

std::tr1::unordered_map<std::string,int> my_map; 
my_map["answer"] = 42; 
printf("The answer to life and everything is: %d\n", my_map["answer"]); 
+3

Salida de estilo C con contenedores de estilo C++? ¡Ay! – Bill

+22

Bienvenido al mundo real :) –

1

El nombre aceptado en TR1 (y el proyecto para el próximo estándar) es std::unordered_map, por lo que si usted tiene la disponible, es probable que sea el que usted desea utilizar.

Aparte de eso, su uso es muy parecido a usar std::map, con la condición de que cuando/si se recorre los elementos de una std::map, salen en el orden especificado por operator<, pero para un unordered_map, el orden es generalmente sin sentido.

Cuestiones relacionadas