2010-12-09 16 views
9

Estoy usando Boost unordered_map. Tengo un par de valores clave para cada entrada. ¿Cómo podría determinar si existe un valor particular en el mapa? (No quiero crear otro mapa no ordenado que almacenó el valor como clave y clave como valor)Encontrar valor en unordered_map

Gracias.

Respuesta

5

Necesita iterar sobre todos los elementos en el unordered_map y ver si el valor dado existe.

El algoritmo std::find_if con un predicado personalizada se puede utilizar para simplificar esto.

+1

¿predicado personalizado? Todo lo que necesitas ya está en STL. 'compose1 (bind2nd (equal_to (), value), select2nd >())' – ephemient

+9

@ephemient: Eso no es simple ni legible. (Además, 'select2nd', mientras que parte de la STL, no forma parte de la biblioteca estándar de C++) –

+6

@ephemient: Ese es uno de los peores usos de STL que he visto en mi vida. –

7

Boost tiene la Bimap, que es un mapa bidireccional (es decir, las claves y valores Ambos se refieren a cada otro). Esto suena más apropiado para sus necesidades que el unordered_map.

+0

¿OP dice que no quiere un mapa inverso? Aunque no justifican por qué. – ephemient

+3

Los niños pequeños no quieren ir al dentista, pero la buena crianza lo hace de todos modos. – chrisaycock

+1

@ephemient: Creo que el OP no quiere tener que mantener una estructura de datos separada (más probable). Por lo tanto, si viene todo empaquetado, no puedo ver por qué habría un problema (ya que la igualdad se define de todos modos para 'valor'). –

9

¿Qué hay de lo siguiente:

typedef std::unordered_map<int,std::string> map_type; 
typedef std::unordered_map<int,std::string>::value_type map_value_type; 

map_type m; 

if (m.end() != find_if(m.begin(),m.end(),[](const map_value_type& vt) 
              { return vt.second == "abc"; } 
              )) 
    std::cout << "Value found." << std::end; 
else 
    std::cout << "Value NOT found." << std::end; 

O usando una variable externa que se captura:

std::string value = "abc"; 
if (m.end() != find_if(m.begin(),m.end(),[&value](const map_value_type& vt) 
               { return vt.second == value; })) 
    std::cout << "Value found." << std::end; 
else 
    std::cout << "Value NOT found." << std::end; 
+0

Gracias por su respuesta. Para la expresión lambda, ¿cómo podría pasar el argumento in si el retorno vt.second == "abc" en el que el "abc" es un argumento que necesita pasar? – Ashley

+8

He actualizado el ejemplo anterior. En resumen, captura la variable del ámbito en el que se define el lambda. –

+0

Buena respuesta, requiere C++ 0x (o extensiones a C++ 03) sin embargo. –

-3

Por qué no podemos usar el método de recuento en lugar de find()

Descripción : Elementos de conteo con una clave específica Busca en el contenedor elementos cuya clave es k y devuelve la cantidad de elementos encontrados. Debido a que los contenedores desordenados no permiten claves duplicadas, esto significa que la función realmente devuelve 1 si un elemento con esa clave existe en el contenedor, y cero en caso contrario.

unordered_map<int, int> hash; 
    //converted array into hashMap 
    for(int i=0; i<6; i++) 
    { 
     hash[i]; 
    } 

    //commom elemenest value is set to 1 in hashMap 
    for(int i =0; i<7; i++) 
    { 
     //element exist in array1 
     if(hash.count(i)) 
     { 
      hash[i] = 1; 
     } 
    } 
+1

No responde la pregunta: OP quiere buscar un valor, no una clave. – Jarrett

Cuestiones relacionadas