我可以重用一个无效的迭代器吗?

时间:2014-07-11 00:34:09

标签: c++ map iterator erase

以下代码有效(并且无可否认,这不是解决此例程的最有效方法)。我的问题是,我不鼓励重用迭代器,就像我在这里做的那样?它可能会产生奇怪的行为吗?如果是这样,为什么?

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

2 个答案:

答案 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();