2017-09-15 114 views
0

我想刪除一些滿足條件的地圖元素。我確實找到了解決方案,但我不知道如何使用它。如何從地圖中刪除元素

我:

std::map<char,int> first; 
first['a']=10; 
first['b']=60; 
first['c']=50; 
first['d']=70; 

給出的解決方案是:

namespace stuff { 
    template< typename ContainerT, typename PredicateT > 
    void erase_if(ContainerT& items, const PredicateT& predicate) { 
     for(auto it = items.begin(); it != items.end();) { 
      if(predicate(*it)) it = items.erase(it); 
      else ++it; 
     } 
    }; 
} 

我需要的是如何採用此功能刪除其數量< = 50個元素:

using stuff::erase_if; 
int test_value = 50; // or use whatever appropriate type and value 
erase_if(container, [&test_value](item_type& item) { 
    return item.property <= test_value; // or whatever appropriate test 
}); 
+0

爲什麼你的拉姆達使用'ITEM_TYPE&當你的地圖擁有item'了'char'? – NathanOliver

+0

爲什麼沒有嘗試使用[map :: erase](http://www.cplusplus.com/reference/map/map/erase/) –

+0

如果你只是想刪除前兩個元素,那麼爲什麼你甚至需要那個功能?調用'erase'兩次有什麼問題? –

回答

1

你這裏的問題是你的拉姆達在

erase_if(container, [&test_value](item_type& item) { 
    return item.property <= test_value; // or whatever appropriate test 
}); 

你有item_type& itemitem.property這不是什麼你要。當你取消引用地圖迭代器時,你會得到一個std::pair<const key_type, T>,這就是lambda需要採取的操作。我們可以使用

erase_if(container, [&test_value](const std::map<char,int>::value_type& item) { 
    return item.second <= test_value; 
}); 

但是,這意味着,如果我們改變地圖使用,我們需要改變的item類型的其他一些重要的。爲了避免這種情況,我們可以使用使用auto通用拉姆達像

erase_if(container, [&test_value](const auto& item) { 
    return item.second <= test_value; 
}); 
+0

是我所需要的,但我認爲我需要修改函數erase_if的參數定義,因爲它使用std :: pair –

+0

@ Blood-HaZaRd Oops。忘了迭代器返回一個值密鑰對。讓我解決這個問題。 – NathanOliver

+0

謝謝。有用。 –

4

爲什麼不使用std::map::erase?如在

first.erase(first.begin()); 

這將從地圖中刪除「第一個」項目。

如果你想刪除某個特定的鍵,那麼它只是相同的:

first.erase('a'); 
+0

對不起,我修改了這個問題,所以我想刪除第一個和第三個 –

+0

@ Blood-HaZaRd和「第三」是否指特定的鍵(如''c'')?或者來自'begin()'的第三個? –

+2

@BorislavKostov不幸的是,map迭代器不是隨機訪問迭代器,所以你不能使用二進制'+'。 –