2009-05-28 19 views
5

Voy a mantener este breve.Extracción del elemento del mapa por valor

Estoy tratando de mantener un mapa entre cadenas y punteros a objetos, y como tal, uso std :: map. Tengo un administrador que es una clase global que realiza un seguimiento del mapa, y cada vez que se llama al destructor de un objeto, le dice al administrador que se ha eliminado.

La única forma en que se me ocurre es buscar en el mapa el objeto. ¿Existe una solución STL eficiente para este problema? ¿Existe un mapa que sea eficiente para buscar por clave también?

Respuesta

8

No, no hay una forma eficiente de hacer esto con std :: map que no sea iterar al comparar los valores.

Sin embargo, la mayoría de las veces la clave de un valor se puede calcular a partir del valor en sí. Por ejemplo, usar la propiedad Name de un objeto Person como la clave. ¿Es posible que el administrador almacene una lista de pares clave/valor en lugar del valor en sí mismo? Esto resolvería su problema sin tener que reescribir un nuevo algoritmo.

O, alternativamente, puede mantener un mapa inverso en la clase de administrador. Esencialmente valor para la clave. De esta forma, podría usarla para calcular la clave que eliminará más adelante.

+0

Gracias! Ni siquiera pensé en tener el objeto de almacenar la clave en sí. Definitivamente una mejor solución que tener un segundo mapa. –

+0

+1, eliminaré mi respuesta ya que suena igual que la tuya. –

1

Eche un vistazo a la biblioteca Boost Multi-Index Containers.

+0

Tenga en cuenta que necesita claves y valores para ser únicos con el fin de utilizar un mapa bidireccional. std :: map solo requiere claves únicas. –

4

En cuanto a SGI's documentation for the STL,

mapa tiene la importante propiedad de que la inserción de un nuevo elemento en un mapa no invalida iteradores que punto a elementos existentes. El borrado de un elemento de un mapa tampoco invalida ningún iterador, excepto el del supuesto, para los iteradores que realmente apuntan al elemento que está siendo borrado .

De modo que puede almacenar un iterador en el mapa dentro de su objeto, y usarlo como una clave de búsqueda de tiempo constante cuando necesite eliminar su entrada.

Cuestiones relacionadas