Найти сопоставленное значение карты - PullRequest
35 голосов
/ 24 ноября 2010

Есть ли в C ++ способ найти сопоставленное значение (вместо ключа) карты, а затем вернуть ключ? Обычно я делаю someMap.find(someKey)->second, чтобы получить значение, но здесь я хочу сделать обратное и получить ключ (значения и ключи уникальны).

Ответы [ 6 ]

36 голосов
/ 24 ноября 2010

Из-за того, как устроен map, вам нужно будет выполнить поиск по неупорядоченным данным.

for (it = someMap.begin(); it != someMap.end(); ++it )
    if (it->second == someValue)
        return it->first;
11 голосов
/ 02 июня 2018

Использование лямбды (C ++ 11 и новее)

//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;
10 голосов
/ 24 ноября 2010

То, что вы ищете, это Bimap, и в Boost доступна его реализация: http://www.boost.org/doc/libs/1_36_0/libs/bimap/doc/html/index.html

2 голосов
/ 23 ноября 2017

Мы можем создать обратную карту, которая отображает значения на ключи.

Как,

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

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

Это также в основном похоже на линейный поиск, но будет полезно, если у вас есть несколько запросов.

1 голос
/ 06 января 2017
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 голосов
/ 13 марта 2019

Поскольку это еще не было упомянуто: структурированные привязки (доступны с C ++ 17) обеспечивают удобный способ написания того же цикла, что показан в Ответ Билла Линча , т.е.

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