Existe-t-il un moyen en C++ pour rechercher la valeur mappée (au lieu de la clé) d'une carte, puis renvoyer la clé? Habituellement, je fais someMap.find(someKey)->second
pour obtenir la valeur, mais ici je veux faire le contraire et obtenir la clé (les valeurs et les clés sont toutes uniques).
En raison de la conception d'un map
, vous devrez effectuer l'équivalent d'une recherche sur des données non ordonnées.
for (it = someMap.begin(); it != someMap.end(); ++it )
if (it->second == someValue)
return it->first;
Utilisation de lambdas (C++ 11 et plus récent)
//A MAP OBEJCT
std::map<int, int> mapObject;
//INSERT VALUES
mapObject.insert(make_pair(1, 10));
mapObject.insert(make_pair(2, 20));
mapObject.insert(make_pair(3, 30));
mapObject.insert(make_pair(4, 40));
//FIND KEY FOR BELOW VALUE
int val = 20;
auto result = std::find_if(
mapObject.begin(),
mapObject.end(),
[val](const auto& mo) {return mo.second == val; });
//RETURN VARIABLE IF FOUND
if(result != mapObject.end())
int foundkey = result->first;
Ce que vous recherchez est un Bimap, et il existe une implémentation disponible dans Boost: http://www.boost.org/doc/libs/1_36_0/libs/bimap/doc/html/index .html
Nous pouvons créer un reverseMap qui mappe les valeurs aux clés.
Comme,
map<key, value>::iterator it;
map<value, key> reverseMap;
for(it = originalMap.begin(); it != originalMap.end(); it++)
reverseMap[it->second] = it->first;
Cela ressemble également à une recherche linéaire, mais sera utile si vous avez un certain nombre de requêtes.
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 );
Comme cela n'a pas encore été mentionné: les liaisons structurées (disponibles depuis C++ 17) permettent un moyen pratique d'écrire la même boucle que celle décrite dans réponse de Bill Lynch , c'est-à-dire.
for (const auto& [key, value] : someMap)
if (value == someValue)
return key;