获取与地图中的查询匹配的所有键

时间:2012-11-02 20:50:17

标签: c++ stl map

假设我在地图中有多个具有相同值的键。那么在这种情况下,我如何检索与查询匹配的所有密钥。

或者,是否有可能告诉查找操作在特定值之后搜索 我使用的是std::map,C ++。

5 个答案:

答案 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。