web-dev-qa-db-fra.com

Trouver la valeur mappée de la carte

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).

37
wrongusername

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;
36
Bill Lynch

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;
12
Pavan Chandaka

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

10
Paul

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.

2
Karan Saxena
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 );
0
이원용

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;
0
lubgr