2010-01-22 244 views
15

我有STL Multimap,我想从具有特定值的映射中删除条目,我不想删除整个键,因为该键可能映射到所需的其他值。STL Multimap删除/擦除值

请任何帮助。

+1

一个可能的修复可能是交换键和值,这可能不是所有阅读本文的选项,但可能适合一些阅读。 – dangerousdave 2012-10-12 11:07:05

回答

14

如果我理解正确,这些值可以出现在任何键下。如果是这种情况,你必须迭代你的multimap并擦除特定的值。

typedef std::multimap<std::string, int> Multimap; 
Multimap data; 

for (Multimap::iterator iter = data.begin(); iter != data.end();) 
{ 
    // you have to do this because iterators are invalidated 
    Multimap::iterator erase_iter = iter++; 

    // removes all even values 
    if (erase_iter->second % 2 == 0) 
     data.erase(erase_iter); 
} 
+0

是的你是正确的,值可以出现在任何键下。 – Avinash 2010-01-22 08:52:51

+0

谢谢这适用于我,我一直在寻找使用remove_if算法。 – Avinash 2010-01-22 10:18:54

+0

恐怕来自''的'remove_if'只适用于可以重新赋值(vector,deque,list - 除了最后的次优)的容器,执行'* it1 = * it2'。这对于地图来说是不可能的,因为它可能会破坏排序。 – UncleBens 2010-01-22 16:28:51

1

由于C++ 11,std::multimap::erase返回最后删除的元素下面的迭代器。

所以,你可以稍微更干净改写尼古拉的回答,而不需要介绍当地erase_iter变量:

typedef std::multimap<std::string, int> Multimap; 
Multimap data; 

for (Multimap::iterator iter = data.begin(); iter != data.end();) 
{ 
    // removes all even values 
    if (iter->second % 2 == 0) 
     iter = data.erase(iter); 
    else 
     ++iter; 
} 

(参见回答this question