2010-11-24 15 views
25

¿Hay alguna manera en C++ para buscar el valor asignado (en lugar de la clave) de un mapa, y luego devolver la clave? Por lo general, hago someMap.find(someKey)->second para obtener el valor, pero aquí quiero hacer lo contrario y obtener la clave (los valores y las claves son todos únicos).Buscar el valor asignado del mapa

+1

posible duplicado de [¿Hay una buena manera de buscar por clave y valor?] (Http://stackoverflow.com/questions/3848483/is-there-a-good-way-to-search-by- both-key-and-value) –

+1

@Fred: la pregunta vinculada nunca recibió una respuesta, solo una alternativa (que parecía satisfacer esa necesidad particular, pero ese no es el punto). –

+0

Posible duplicado de [Comprobar el valor existe en un estándar :: mapa - C++] (http://stackoverflow.com/questions/535317/checking-value-exist-in-a-stdmap-c) – CharlesB

Respuesta

26

Debido a la forma en que se diseña un map, deberá hacer el equivalente de una búsqueda de datos no ordenados.

for (it = someMap.begin(); it != someMap.end(); ++it) 
    if (it->second == someValue) 
     return it->first; 
+0

Es lo mismo. Simplemente está desmarcando el puntero en lugar de llamar ->. Probablemente compila exactamente el mismo código. – Falmarri

+0

Eso puede ser exactamente lo que se necesita, pero solo un comentario: devuelve la primera clave, que puede no ser la única que se asigna a 'someValue'. Incluso si luego se borra o se altera para que no coincida en la próxima búsqueda, no es bueno reiniciar innecesariamente la iteración desde begin(), pero ese valor del iterador inicial se puede pasar como un argumento de función. Espero que el afiche pueda buscar los detalles a medida que surjan. –

+0

@Falmarri Sé que hace lo mismo, solo me pregunto si hay una razón específica para hacerlo de esa manera. Me parece que el código no es tan bueno como 'it (flecha) key' :) – wrongusername

1
struct test_type 
{ 
    CString str; 
    int n; 
}; 


bool Pred(std::pair< int, test_type > tt) 
{ 
    if(tt.second.n == 10) 
     return true; 

    return false; 
} 


std::map< int, test_type > temp_map; 

for(int i = 0; i < 25; i++) 

{ 
    test_type tt; 
    tt.str.Format(_T("no : %d"), i); 
    tt.n = i; 

    temp_map[ i ] = tt; 
} 

auto iter = std::find_if(temp_map.begin(), temp_map.end(), Pred); 
+1

¿Puedes dar una explicación con el código? – rjdkolb

2

Podemos crear un reverseMap que asigna valores a las teclas.

igual,

map<key, value>::iterator it; 
map<value, key> reverseMap; 

for(it = originalMap.begin(); it != originalMap.end(); it++) 
    reverseMap[it->second] = it->first; 

Esto también es básicamente como una búsqueda lineal, pero será útil si usted tiene un número de consultas.

Cuestiones relacionadas