假设我在地图中有多个具有相同值的键。那么在这种情况下,我如何检索与查询匹配的所有密钥。
或者,是否有可能告诉查找操作在特定值之后搜索
我使用的是std::map
,C ++。
答案 0 :(得分:2)
这样的事情对你有用:
void FindKeysWithValue(Value aValue, list<Key>& aList)
{
aList.clear();
for_each(iMap.begin(), iMap.end(), [&] (const pair<Key, Value>& aPair)
{
if (aPair.second == aValue)
{
aList.push_back(aPair.first);
}
});
}
答案 1 :(得分:1)
唯一的方法是迭代地图。
此链接可能有用:Reverse map lookup
答案 2 :(得分:1)
关联容器可能对你没有多大帮助,因为对于std::map<K, V>
,密钥恰好是唯一的,并且你选择的查询与你使用的排序关系匹配的可能性可能不会太高。如果订单匹配,您可以使用std::map<K, V>
成员lower_bound()
和upper_bound()
。对于std::multimap<K, V>
,您还可以使用equal_range()
。
通常,即,如果查询与订单实际上没有关系,则可以使用std::copy_if()
来获取与谓词匹配的对象序列:
Other other;
// ...
std::vector<Other::value_type> matches;
std::copy_if(other.begin(), other.end(),
std::back_inserter(matches), predicate);
复制元素过于昂贵时,您应该考虑使用std:find_if()
代替:
for (auto it(other.begin());
other.end() != (it = std::find_if(it, other.end(), predicate));
++it) {
// do something with it
}
答案 3 :(得分:1)
如果您想要快速访问并且不介意使用更多空间,那么您将维护另一个存储为value,key的映射。在您的情况下,您需要处理重复值(您将存储为键)。
不是一个好主意,但绝对是一个选择。
答案 4 :(得分:0)
map
用于有效查找密钥。基于值的查找效率不高,您基本上必须遍历地图,自己提取匹配项:
for(map<A,B>::iterator i = m.begin(); i != m.end(); i++)
if(i->second == foo)
you_found_a_match();
如果您打算经常这样做,您可以通过其他方式构建多地图映射,这样您就可以有效地执行基于值的查找:
multimap<B,A> reverse;
for(map<A,B>::iterator i = m.begin(); i != m.end(); i++)
reverse.insert(pair<B,A>(i->second,i->first));
您现在可以轻松找到具有给定值的键:
matches = reverse.equal_range(value);
for(multimap<B,A>::iterator i = matches.first; i != matches.second; i++)
A & key = i->second;
如果这些地图不会持续增长,那么简单地维护矢量&gt;可能更有效。相反,根据值为它定义一个比较器,并在其上使用equal_range。