当映射中已知值时获取键的最佳方法

Best way of obtaining a key when a value is known in a map

本文关键字:获取 最佳 方法 映射      更新时间:2023-10-16

>假设我有一张这样的地图

std::map<std::string,in> mp;
mp["KeyA"] = 1;
mp["KeyB"] = 2;
mp["KeyD"] = 3;
mp["KeyF"] = 4;

现在,当我有一个已知的值时,我需要获取密钥,例如,如果我有 1,我想获取 KeyA。我唯一的想法是我需要遍历整个地图,一旦找到一个值,然后返回键。例如,psudocode解释了我的方法。

for(std::map<std::string,in>::iterator it = mp.begin();i<mp.end;++i)
{
  if(it->second == somevalue)
  {
     return it->first;
  }
} 

我想知道是否有更快或更好的方法来实现这一目标

通常,

当您想要反向查找时,您有两个映射:一个从键到值,另一个从值到键。 如果您的值不是唯一的,则反向映射需要是一个std::multimap

如果您不打算从地图中更改或移除值,则这是最容易管理的。

如果您不需要反向地图,则需要遍历整个地图才能找到该值。

建立在 Paddy 的答案之上...

typedef std::map<std::string, int> MyMap;
typedef std::multimap<MyMap::mapped_type, MyMap::key_type> InvMap;
typedef InvMap::value_type InvElement;
typedef std::pair<InvMap::iterator, InvMap::iterator> FoundRange;
MyMap myMap;
InvMap invMap;
myMap["foo"] = 1;
myMap["bar"] = 1;
myMap["baz"] = 2;
for (auto it = myMap.begin(), end = myMap.end(); it != end; ++it)
    invMap.insert(InvElement(it->second, it->first));
// Contains begin and end iterators to range of elements found.
FoundRange range = invMap.equal_range(1);
int count = std::distance(range.first, range.second);
printf("Found %i matching value 1", count);