擦除std :: multiset中的元素导致无关的迭代器无效

时间:2016-07-16 02:44:16

标签: c++ c++11

*i

这个程序崩溃,我得到一个错误说" map / set iterator not decrementable"。我认为由于所有元素都是正整数,因此j将大于i,因此i的指向位置将与j不同。根据{{​​3}}:

  

擦除元素的引用和迭代器无效。其他   引用和迭代器不受影响。

由于ji的指向位置不同,删除res.download不会影响res.redirect({URL})和循环。所以我很困惑为什么这是错误的。

环境:Windows10 x86,Visual Studio 2015 Update 3

1 个答案:

答案 0 :(得分:1)

迭代器无效的原因是你的循环擦除了它,后续的for迭代在循环的增量部分使用了无效的迭代器。

如果使用调试器运行它,您将看到在调用erase()时,迭代器i指向与迭代器j相同的元素。您现在s.erase(j)i也无效。在循环迭代中的++i上,尝试增加无效迭代器,从而完成错误。

s.insert(1);
s.insert(2);
s.insert(3);
for (auto i = s.rbegin(); i != s.rend(); 
     ++i) // <-- It's this that is causing the issue
{
    auto j = s.lower_bound(*i << 1);
    if (j != s.end())
        s.erase(j);  // <-- If `i` is pointing to this element, iteration becomes invalidated
}

所以基本上,你正在尝试对不存在的东西执行++。由于您正在使用Visual Studio(按给定的错误),如果您在调试时转到程序集窗口,您会发现它确实是触发错误的++操作。

在迭代器失效时看到这个:multiset::erase并在链接中注明:

对已擦除元素的引用和迭代器无效。