puerta del cielo
No sé cómo usar la función hash en C++, pero sé que podemos usar hash_map
. ¿G++ admite eso simplemente incluyendo #include <hash_map>
? ¿Qué es un ejemplo simple usando hash_map
?
El estándar C++ actual no tiene mapas hash, pero el próximo estándar C++0x sí, y g++ ya los admite en forma de “mapas desordenados”:
#include <unordered_map>
#include <iostream>
#include <string>
using namespace std;
int main() {
unordered_map <string, int> m;
m["foo"] = 42;
cout << m["foo"] << endl;
}
Para obtener esta compilación, debe decirle a g ++ que está usando C ++ 0x:
g++ -std=c++0x main.cpp
Estos mapas funcionan más o menos como lo hace std::map, excepto que en lugar de proporcionar un operator<()
para sus propios tipos, debe proporcionar una función hash personalizada; se proporcionan funciones adecuadas para tipos como enteros y cadenas.
-
@Kornel No, no debería. TR1 nunca fue ratificado: el espacio de nombres tr1 es solo una extensión que proporciona algún compilador. Nunca lo uso en mi propio código.
– luego
3 de febrero de 2010 a las 15:32
-
@Neil, entonces, una persona que usa GCC 3.4, MSVC y otros compiladores que no son de C++ 0x no debería usar TR1, pero ¿gracias esperar hasta que las extensiones de la biblioteca de C++ 0x sean compatibles de forma inmediata?
– Kornel Kisielewicz
3 de febrero de 2010 a las 15:35
-
@Kornel Ciertamente pueden usar TR1, pero no uso VC ++, por lo que no puedo, en conciencia, editar mi respuesta para sugerir que lo hagan. Para estar realmente seguro, que es lo que hace la mayor parte de mi código, no use mapas desordenados. Depende de cuán portátil quieras que sea tu código.
– luego
3 de febrero de 2010 a las 15:40
-
@Neil, hmm, punto tomado, sin embargo, en ese caso, ¿no sería aceptable señalar Boost.Unordered, que se agrega al borrador de trabajo del estándar C++ 0x?
– Kornel Kisielewicz
3 de febrero de 2010 a las 15:48
-
Std ahora tiene un
map
estructura de datos.– Chris
20 de febrero de 2017 a las 20:48
Nikolái Fetissov
#include <tr1/unordered_map>
obtendrá el próximo C++ estándar contenedor de hachís único. 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"] );
-
¿Salida de estilo C con contenedores de estilo C ++? ¡Ay!
– Factura
1 de febrero de 2010 a las 21:11
-
Bienvenidos al mundo real 🙂
– Nikolái Fetissov
1 de febrero de 2010 a las 21:19
Wikipedia nunca falla:
hash_map es una extensión no estándar. unordered_map es parte de std::tr1 y se moverá al espacio de nombres estándar para C++0x. http://en.wikipedia.org/wiki/Unordered_map_%28C%2B%2B%29
El nombre aceptado en TR1 (y el borrador del próximo estándar) es std::unordered_map
por lo que si lo tiene disponible, es probable que sea el que quiera usar.
Aparte de eso, usarlo es muy parecido a usar std::map
con la condición de que cuando/si recorre los elementos en un std::map
salen en el orden especificado por operator<
pero para un mapa_desordenado, el orden generalmente no tiene sentido.
@BlueRaja: Sí, de hecho, usarlo conduce a una confusión tan maravillosa como que la gente cree que
hash_map
es en realidad parte de C++. Creo que esto, como cualquier otra pregunta relacionada con la programación, se siente como en casa aquí en SO, ¿no es así? Decirle a la gente que use Google es una pérdida de tiempo para ellos y para nosotros. La de ellos porque tienen que tamizar miles de respuestas inexactas y poco confiables, y la nuestra porque luego tenemos que derribar todos sus conceptos erróneos y malas prácticas cuando vienen aquí a hacer preguntas más tarde.– jalf
2 de febrero de 2010 a las 0:08
@jalf: como si las respuestas en SO estuvieran garantizadas de alguna manera para ser precisas y confiables.
– solo alguien
2 de febrero de 2010 a las 15:14
Están garantizados para ser vistos y votados por otros programadores, lo que los hace mucho más confiables que la mayoría de lo que un principiante podría encontrar buscando a ciegas en Google.
– jalf
2 de febrero de 2010 a las 15:25