我试图根据特定条件从map中删除一系列元素。如何使用STL算法完成此任务?
最初,我想使用remove_if
,但这是不可能的,因为remove_if不适用于关联容器。
有没有适用于map的"remove_if“等价算法?
作为一个简单的选择,我想到了遍历地图和擦除。但是遍历map和擦除是否是一个安全的选项呢?(因为迭代器在擦除之后变得无效)
我使用了以下示例:
bool predicate(const std::pair<int,std::string>& x)
{
return x.first > 2;
}
int main(void)
{
std::map<int, std::string> aMap;
aMap[2] = "two";
aMap[3] = "three";
aMap[4] = "four";
aMap[5] = "five";
aMap[6] = "six";
// does not work, an error
// std::remove_if(aMap.begin(), aMap.end(), predicate);
std::map<int, std::string>::iterator iter = aMap.begin();
std::map<int, std::string>::iterator endIter = aMap.end();
for(; iter != endIter; ++iter)
{
if(Some Condition)
{
// is it safe ?
aMap.erase(iter++);
}
}
return 0;
}
发布于 2013-05-17 04:39:23
用于std::map (和其他容器)的erase_if
我使用下面的模板来做这件事。
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;
}
}
}
这不会返回任何内容,但会从std::map中删除这些项。
使用示例:
// 'container' could be a std::map
// 'item_type' is what you might store in your container
using stuff::erase_if;
erase_if(container, []( item_type& item ) {
return /* insert appropriate test */;
});
第二个示例(允许您传入测试值):
// 'test_value' is value that you might inject into your predicate.
// 'property' is just used to provide a stand-in test
using stuff::erase_if;
int test_value = 4; // or use whatever appropriate type and value
erase_if(container, [&test_value]( item_type& item ) {
return item.property < test_value; // or whatever appropriate test
});
发布于 2017-04-07 23:41:21
现在,可以在header <experimental/map>
中使用std::experimental::erase_if
。
请参阅:http://en.cppreference.com/w/cpp/experimental/map/erase_if
发布于 2019-11-06 21:23:59
这里有一些优雅的解决方案。
for (auto it = map.begin(); it != map.end();)
{
(SomeCondition) ? map.erase(it++) : (++it);
}
https://stackoverflow.com/questions/800955
复制相似问题