2010-01-22 28 views
15

Tôi có STL Multimap, tôi muốn xóa các mục nhập từ bản đồ có giá trị cụ thể, tôi không muốn xóa toàn bộ khóa, vì khóa đó có thể ánh xạ tới các giá trị khác được yêu cầu.STL Multimap Remove/Erase Values ​​

bất kỳ trợ giúp nào.

+1

Một sửa chữa có thể có thể là để trao đổi các khóa và giá trị , điều này có thể không phải là một lựa chọn cho tất cả việc đọc này, nhưng có thể là cho một số người. – dangerousdave

Trả lời

14

Nếu tôi hiểu chính xác các giá trị này có thể xuất hiện dưới bất kỳ khóa nào. Nếu đó là trường hợp bạn sẽ phải lặp qua multimap của bạn và xóa các giá trị cụ thể.

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

Có bạn là chính xác, các giá trị có thể xuất hiện dưới bất kỳ khóa nào. – Avinash

+0

Cảm ơn Điều này làm việc cho tôi, tôi đang tìm kiếm bằng cách sử dụng các thuật toán remove_if. – Avinash

+0

Tôi sợ 'remove_if' từ' 'chỉ hoạt động cho các vùng chứa có thể gán lại các giá trị (vectơ, deque, list - ngoại trừ suboptimal cho lần cuối) làm' * it1 = * it2'. Điều này là không thể cho bản đồ, vì nó có thể phá vỡ thứ tự. – UncleBens

1

Kể từ C++ 11, std::multimap::erase lợi nhuận một iterator sau các yếu tố loại bỏ cuối cùng.

Vì vậy, bạn có thể viết lại câu trả lời Nikola của hơi sạch hơn mà không cần phải giới thiệu biến erase_iter địa phương:

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; 
} 

(cũng xem câu trả lời để this question)

Các vấn đề liên quan