2010-10-22 17 views
12

He estado cambiando mi código de std :: map a std :: unordered_map cuando sea apropiado. Con std :: mapa, que normalmente escribo lo siguiente sólo para asegurarse de que la llave no se puede modificar:Usando una tecla const para unordered_map

std::map<const std::string, int> 

Francamente, no he comprobado si esto era const de cualquier valor. Esto siempre compiló y trabajó con g ++.

Ahora, con std :: unordered_map, la siguiente falla al vincular con g ++ 4.5.1.

std::unordered_map<const std::string, std::string> m; 
m["foo"] = "bar"; 

con este enlace de error:

Undefined symbols: "std::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const>::operator()(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const" , referenced from:

La solución es simple, para eliminar const, pero aparte de eso, hay incluso un punto en el STL con cualquiera de las clases de contenedores asociativos para utilizar una constante tipo de llave? ¿No hay métodos que le permitan obtener una referencia a la clave para cualquier tipo asociativo?

Respuesta

17

Los contenedores asociativos solo exponen el par (clave, valor) como std::pair<const key_type, mapped_type>, por lo que la configuración adicional en el tipo de clave es superflua.

+5

O en otras palabras: 'std :: unordered_map ' hará lo que quiera. (Dice Jonathan, reiterando lo obvio para la mayoría.) –

+0

Heh, sí, puedo ver cómo mi respuesta requiere mirar la pregunta original para entenderlo :) – MSN

Cuestiones relacionadas