我想删除我的 std::map 中的一些元素。
我编写了删除 + remove_if 技术,我总是使用其他序列容器。
但它不是用 map 编译的。为什么?
我该如何做这份工作?
std::map<int, int> m;
bool foo(const std::pair<int, int>& p)
{
return p.second > 15;
}
int _tmain(int argc, _TCHAR* argv[])
{
m.insert(make_pair(0, 0));
m.insert(make_pair(1, 10));
m.insert(make_pair(2, 20));
m.insert(make_pair(3, 30));
m.erase(
remove_if(m.begin(), m.end(), foo),
m.end()); // compile error
return 0;
}
最佳答案
为 map 写成这样,因为 remove_if
不适用于 map
迭代器(它只是将有问题的元素放在末尾,而 map
迭代器不允许这样做):
template <typename Map, typename F>
void map_erase_if(Map& m, F pred)
{
typename Map::iterator i = m.begin();
while ((i = std::find_if(i, m.end(), pred)) != m.end())
m.erase(i++);
}
或者如果你喜欢单行:
template <typename Map, typename F>
void map_erase_if(Map& m, F pred)
{
for (typename Map::iterator i = m.begin();
(i = std::find_if(i, m.end(), pred)) != m.end();
m.erase(i++));
}
关于c++ - 删除 std::map 中的特定元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7007802/