Find mapped value of map

C++DictionaryFindStdmap

C++ Problem Overview


Is there a way in C++ to search for the mapped value (instead of the key) of a map, and then return the key? Usually, I do someMap.find(someKey)->second to get the value, but here I want to do the opposite and obtain the key (the values and keys are all unique).

C++ Solutions


Solution 1 - C++

Because of how a map is designed, you'll need to do the equivalent of a search on unordered data.

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

Solution 2 - C++

Using lambdas (C++11 and newer)

//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;

Solution 3 - C++

If you are doing this kind of search frequently in larger maps, then it may be interesting to look at a Bimap, that will index both keys and values. There is an implementation of a Bimap available in Boost: https://www.boost.org/doc/libs/1_77_0/libs/bimap/doc/html/index.html

Solution 4 - C++

Structured bindings (available since C++17) enable a convenient way of writing the same loop as depicted in Bill Lynch's answer, i.e.

for (const auto& [key, value] : someMap)
    if (value == someValue)
        return key;

Solution 5 - C++

We can create a reverseMap which maps values to keys.

Like,

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

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

This also is basically like a linear search but will be useful if you have a number of queries.

Solution 6 - C++

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionwrongusernameView Question on Stackoverflow
Solution 1 - C++Bill LynchView Answer on Stackoverflow
Solution 2 - C++Pavan ChandakaView Answer on Stackoverflow
Solution 3 - C++PaulView Answer on Stackoverflow
Solution 4 - C++lubgrView Answer on Stackoverflow
Solution 5 - C++Karan SaxenaView Answer on Stackoverflow
Solution 6 - C++이원용View Answer on Stackoverflow