2011-10-17 18 views
10

Por lo que sé, C++ define map<a,b>::value_type como pair<const a,b>value_type para ver un mapa con punteros como clave

¿Qué pasará si uso un tipo de puntero como tipo de clave en el mapa, es decir, es

std::map<const char*,int>::value_type::first_type = const char* 

lo que cabe esperar de la definición anterior o

std::map<const char*,int>::value_type::first_type = const char* const 

como sería más lógico (ya que de lo contrario se les permitiría cambiar valor de la clave de un mapa iterador)?

+0

considere usar std :: string en su lugar. – nikhil

Respuesta

10

Su razonamiento es correcto, value_type::first sería char const * const.

Hay una fuente común de confusión al pensar que cuando const TT es una type * es const type *, pero eso no es así. A diferencia de las macros, typedef s no son sustitución de texto, ni son argumentos de plantilla. Cuando lo haga const T, si T es un typedef o un argumento de plantilla, está agregando un const al tipo como un todo.

Esa es la razón por la cual uno me gusta escribir mis const s a la derecha del tipo, ya que causa menos confusión: T const *, añada una const adicional, obtener T const * const.

+0

que está aliviando. Supongo que deberíamos difundir, especialmente entre los nuevos programadores, la convención de usar 'type const' en lugar de' const type', lo que evitaría confusiones en el caso en que 'type' sea un puntero. – pqnet

2

Si a es const char*, entonces const a es de hecho const char* const.

0

Tiene usted razón en su evaluación, pero hay que tener mucho cuidado con este enfoque por dos razones:

  1. Usted tiene que suministrar un predicado comparador personalizado que hace ordenación adecuada de const char * (por ejemplo, utilizando una variante de strcmp que solo devuelve verdadero si key1 < key2). Si no hace esto, sus cadenas se ordenarán por valores de puntero, que casi siempre no es lo que quiere.
  2. Debe tener en cuenta la vida útil de las claves en su mapa y cómo serán desasignadas cuando se destruya el mapa.
+0

sí, generalmente sería un error común, sin embargo hay casos en los que realmente solo desea comparar punteros en lugar de cadenas (ejemplos: si tiene cadenas de tiempo constante de compilación como clave, como una versión imprimible de una enumeración, o si está haciendo un mapa de HWND a un objeto de manejo de ventana relativo en una administración de eventos de winapi) – pqnet

Cuestiones relacionadas