Búsqueda clave secundaria en estructura Map C++

Aziwar

Buenas! Estoy utilizando una estructura map<string, int>.

El tema está en que con el find solo puede hacer búsquedas del string, pero necesito también poder realizar búsquedas para el int.

Ahora mismo lo tengo implementado como una búsqueda secuencial, pero no es nada eficiente. Necesito poder utilizar el find para buscar int tambíen, como podría hacerlo?

maRc

A lo mejor se me está yendo la pinza, pero creo que un map no está pensado para hacer lo que pides. En un map se busca por la clave, que es única, pero no por el valor.

Ahora bien, puedes implentarte una función para hacer eso, como has hecho secuencial, aunque tendrá coste O(n), ya que tienes que recorrer todos los elementos.

Aziwar

El map por lo que me dió a entender el profesor sirve para realizar tablas de relaciones como la que acabo de comentar.

Yo antes usaba un vector de string, entonces hacia la relación de (string, int) en función de la posición del array en la que estaba guardado el string. Pero el vector de la STL no tiene un método find, así que me dijo que usara el map que sirve para lo mismo y tiene el find, notándose una mejora MUY razonable xD

maRc

He estado mirando y es lo que te digo, a un map se accede por la clave, que debe de ser única, no por el valor.

Depende como esté implementado la búsqueda de la clave, tiene un coste distinto, pero en el caso de STL, es logarítmico para buscar/insertar/eliminar, y lineal para iterar por todos los elementos, entre otros. En STL suele ser con un árbol binario balanceado.

Te tocará buscar otra estructura si quieres poder buscar por valores de forma rápida.

dagavi

Un map sirve para tener pares "clave-valor" en el cual dada una clave (única, no hay dos pares con la misma clave) puedes obtener su valor de forma eficiente.

Si quieres tener lo contrario también con un map podrías hacer otro segundo map intercambiando los valores, pero las claves deben de ser únicas.

NeB1

genera 2 maps, uno <string, int> y a partir de este generas otro <int, string> que mantenga las mismas relaciones. Te creas una clase que contenga ambos maps, y que según el tipo de .find que hagan llame a un map o al otro.

class MapDopao{
    public:
        find(int key){
             map1.find(key..
        }
        find(string key){
             map2.find....
        }
    private:
        map1<string,int>
        map2<int,string>
}

No te serviría?

maRc

#6, eso no sirve porque puedes tener varias entradas con el mismo valor. Si que podrías si en lugar de un map para almacenar por enteros, utilizas un multimap, que permite duplicar claves.

NeB1

#7 no te entiendo, porque tendrías entradas duplicadas?

maRc

Un map se identifica por la clave, no por el valor. Si el valor que almacena cada entrada en el map no se puede repetir, no tiene sentido utilizar un map.

Así que si quieres "reordenar" un map por su valor en lugar de la clave, necesitas que este acepte claves duplicadas, como es el caso del multimap de STL.

Aziwar

Buenas ya terminé de hacer el programa. Lo de usar 2 maps se me había ocurrido, pero no servía ya que cuando tenia que usar el <int,string> necesitaba también el otro.

Para el caso de querer buscar int lo que hice fue utilizar un vector normal y corriente. Tener la información por duplicado, pero a la hora de obtener la información de un índice, o de comprobar si ese índice lo había utilizado lo hacía de modo directo.

Ahora tengo un problema con la librería zlib. http://cplusplus.com/reference/ aquí no sale nada sobre ella, y necesito utilizarla. Cómo se utiliza? He visto algo sobre inflate y deflate, pero nada más

Usuarios habituales

  • Aziwar
  • maRc
  • NeB1
  • dagavi