以下代码有效(并且无可否认,这不是解决此例程的最有效方法)。我的问题是,我不鼓励重用迭代器,就像我在这里做的那样?它可能会产生奇怪的行为吗?如果是这样,为什么?
std::map<char, int> map;
map['a'] = 10;
map['b'] = 30;
map['c'] = 50;
map['d'] = 70;
std::map<char, int>::iterator iterator = map.begin();
for (; iterator != map.end(); iterator++) {
if (iterator->second == 30 || iterator->second == 50) {
map.erase(iterator);
iterator = map.begin();
}
}
答案 0 :(得分:3)
您没有使用无效的迭代器,但您的逻辑存在缺陷。要修复它,请对代码进行一些小改动;如果在当前迭代期间未擦除元素,则仅递增迭代器。使用当前代码,假设map
中的前两个元素符合擦除标准。然后第二个将保持未被删除,因为你在第二次迭代中通过循环增加它。
for (; iterator != map.end();) {
if (iterator->second == 30 || iterator->second == 50) {
map.erase(iterator);
iterator = map.begin();
} else {
++iterator;
}
}
如果您的编译器支持C ++ 11,则可以执行此操作来删除map
for (; iterator != map.end(); ) {
if (iterator->second == 30 || iterator->second == 50) {
iterator = map.erase(iterator);
} else {
++iterator;
}
}
答案 1 :(得分:3)
不,重新分配给迭代器并重用它没有任何问题,因为在赋值运算符运行后,旧的值被完全覆盖。
iterator = map.begin();