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