繁体   English   中英

如何从地图中删除元素

[英]How delete elements from map

我想删除一些满足条件的地图元素。 我确实找到了解决方案,但不知道如何使用。

我有:

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

为什么不使用std::map::erase呢?

first.erase(first.begin());

这将从地图上删除“第一”项。

如果要删除特定的密钥,则相同:

first.erase('a');

您的问题在于您的lambda在

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的通用lambda

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM