2009-10-29 14 views
39

Recientemente descubrí que la implementación del mapa hash en C++ se llamará unordered_map.Diferencia entre hash_map y unordered_map?

Al levantar la vista por qué no estaban simplemente utilizando hash_map, descubrí que al parecer hay problemas de compatibilidad con la implementación de hash_map que resuelve unordered_map (más sobre esto here).

Esa página wiki no proporciona mucha más información, por lo que me pregunto si alguien sabía algunos de los problemas con hash_map que unordered_map resuelve.

Respuesta

63

Dado que no había una tabla hash definida en la biblioteca estándar de C++, los diferentes implementadores de las bibliotecas estándar proporcionarían una tabla hash no estándar a menudo llamada hash_map. Debido a que estas implementaciones no se escribieron siguiendo un estándar, todas tenían diferencias sutiles en la funcionalidad y las garantías de rendimiento.

Comenzando con C++11 se ha agregado una implementación de tabla hash al estándar de biblioteca estándar de C++. Se decidió utilizar un nombre alternativo para la clase para evitar colisiones con estas implementaciones no estándar y para evitar el uso inadvertido de la nueva clase por parte de los desarrolladores que tenían hash_table en su código.

El nombre alternativo elegido es unordered_map que realmente es más descriptivo ya que insinúa la interfaz del mapa de la clase y la naturaleza desordenada de sus elementos.

+4

Y esta es una de las cosas que muestran que el espacio de nombres 'std' no hizo exactamente lo que esperaban. No es que yo sepa lo que razonablemente hubiera evitado el problema. –

+1

Un espacio de nombre anidado, como tr1 ... –

+0

MSVC tenía stdext para sus bibliotecas de extensión Estándar. – Puppy