2010-01-22 231 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