¿Por qué std:: map no tiene un accessor const?


La declaración para el operador [] en un mapa std:: es la siguiente:

T& operator[] ( const key_type& x );

¿Hay alguna razón por la que no sea esto?

T& operator[] ( const key_type& x );
const T& operator[] const ( const key_type& x );

Porque eso sería increíblemente útil en cualquier momento que necesite acceder a un mapa de miembros en un método const.

Author: Calder, 2012-12-16

5 answers

operator[] en un mapa devuelve el valor en la clave especificada o crea un nuevo elemento inicializado de valor para esa clave si no está ya presente, por lo que sería imposible.

Si operator[] tuviera una sobrecarga const, agregar el elemento no funcionaría.

Eso responde a la pregunta. Alternativas:

Para C++03 - usted puede usar iteradores (estos son const y no-const junto con find). En C++11 puede usar el método at.

 79
Author: Luchian Grigore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-17 08:08:16

A partir de C++11 existe std::map::at que ofrece acceso const y no const.

En contraste con operator[] lanzará una excepción std::out_of_range si el elemento no está en el mapa.

 84
Author: inf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-16 15:35:43

Estas respuestas son correctas en que operator[] tiene semántica para agregar una clave si no existe, pero me gustaría agregar otra perspectiva:{[12]]}

Observe cómo operator[] devuelve un T&. Es decir, devuelve una referencia al value que está asociado con key. Pero, ¿qué pasa si no hay key en el map? ¿Qué debemos devolver? No hay tal cosa como una" referencia nula", y lanzar una excepción sería molesto.

Esta sería una buena razón para no operator[] const. ¿A qué volverías? el usuario si no pudo agregar nada a la map (porque el operador es const), pero están buscando un elemento que no existe? Una buena solución a este problema es no tener el operator[] const.

 16
Author: Cornstalks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-02 05:10:57

El (non-const) operator[] crea la clave si no existe.

La versión const de ese operador, si existiera, tendría que tener una semántica diferente, ya que no podría agregar una nueva clave.

Estoy seguro de que estaría de acuerdo en que tener const y no-const sobrecargas con semántica significativamente diferente sería una lata de gusanos. Por lo tanto, no se proporciona ninguna versión const.

Sin embargo, hay un miembro const find(), por lo que puede usarlo en su código.

 6
Author: NPE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-16 15:33:22

Porque la semántica de operator[] es agregar la clave si no existe.

 4
Author: eduffy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-16 15:27:30