2010-01-22 21 views
15

Mam STL Multimap, chcę usunąć wpisy z mapy, która ma określoną wartość, nie chcę usunąć całego klucza, ponieważ klucz ten może być odwzorowany na inne wartości, które są wymagane.STL Multimap Usuń/usuń wartości

proszę o pomoc.

+1

Ewentualna poprawka może być do wymiany kluczy i wartości może to nie być opcja dla wszystkich czytających to, ale może być dla niektórych. – dangerousdave

Odpowiedz

14

Jeśli dobrze rozumiem, wartości te mogą pojawić się pod dowolnym kluczem. W takim przypadku będziesz musiał powtórzyć multimap i usunąć określone wartości.

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

Tak, masz rację, wartości mogą pojawić się pod dowolnym klawiszem. – Avinash

+0

Dzięki to działa dla mnie, szukałem przy użyciu algorytmów remove_if. – Avinash

+0

Obawiam się, że 'remove_if' from' 'działa tylko w przypadku kontenerów, w których możliwe jest ponowne przypisanie wartości (wektor, deque, list - z wyjątkiem suboptymalnych dla ostatnich), wykonując' * it1 = * it2'. Nie jest to możliwe w przypadku mapy, ponieważ może ona zepsuć kolejność. – UncleBens

1

ponieważ C++ 11 std::multimap::erase powraca iterację po ostatniej usuniętego elementu.

Więc można przepisać odpowiedź Nikola nieznacznie bardziej gładko, bez konieczności wprowadzenia zmiennej lokalnej 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; 
} 

(Patrz również odpowiedzieć na this question)