Есть ли способ в С++ для поиска отображаемого значения (вместо ключа) карты, а затем вернуть ключ? Обычно я делаю someMap.find(someKey)->second
, чтобы получить значение, но здесь я хочу сделать обратное и получить ключ (значения и ключи уникальны).
Найти сопоставленное значение карты
Ответ 1
Из-за того, как устроен map
, вам нужно будет выполнить поиск по неупорядоченным данным.
for (auto it = someMap.begin(); it != someMap.end(); ++it)
if (it->second == someValue)
return it->first;
Ответ 2
Использование лямбд (С++ 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;
Ответ 3
То, что вы ищете, это Bimap, и его реализация доступна в Boost: http://www.boost.org/doc/libs/1_36_0/libs/bimap/doc/html/index.html
Ответ 4
Мы можем создать обратную карту, которая отображает значения в ключи.
Как
map<key, value>::iterator it;
map<value, key> reverseMap;
for(it = originalMap.begin(); it != originalMap.end(); it++)
reverseMap[it->second] = it->first;
Это также похоже на линейный поиск, но будет полезно, если у вас есть несколько запросов.
Ответ 5
Поскольку это еще не было упомянуто: структурированные привязки (доступны с С++ 17) обеспечивают удобный способ написания того же цикла, который показан в ответе Билла Линча, т.е.
for (const auto& [key, value] : someMap)
if (value == someValue)
return key;
Ответ 6
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 );