【发布时间】:2014-07-31 06:26:46
【问题描述】:
我想遍历 std::multimap 中的所有项目(所有键的所有值),并删除所有满足某些条件的条目:
#include <map>
typedef int KEY_TYPE;
typedef int VAL_TYPE;
bool shouldRemove(const KEY_TYPE&, const VAL_TYPE&);
void removeFromMap(std::multimap<KEY_TYPE,VAL_TYPE>& map){
for (auto it = map.begin(); it != map.end(); it++){
if (shouldRemove(it->first,it->second))
map.erase(it);
}
}
除非第一个项目被删除,否则迭代将起作用,然后引发以下错误:
map/set 迭代器不可递增
如何重写removeFromMap 函数才能正常工作?该代码应适用于地图的各种键值类型。
我正在使用 C++ 11 和 Visual Studio 2013。
【问题讨论】:
-
通常使用map.erase(iterator)的返回值,因为它将迭代器返回到下一个元素或结束,如果它是最后一个元素
-
@Erbureth 您应该将其添加为答案:-)
-
@KarlNicoll 但是在深入挖掘之后,Erase-remove 习语不适用于
std::set、std::map和朋友,因为它们的值类型不是MoveAssignable。而且我不知道如何在这样的容器上实现它,因为它通过移动元素来工作。