0

假设我有一张这样的地图

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

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

4

2 回答 2

2

以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);
于 2013-09-30T03:52:19.760 回答
2

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

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

如果您不想要反向映射,则需要遍历整个映射以查找值。

于 2013-09-30T03:18:07.257 回答