*i
这个程序崩溃,我得到一个错误说" map / set iterator not decrementable"。我认为由于所有元素都是正整数,因此j
将大于i
,因此i
的指向位置将与j
不同。根据{{3}}:
擦除元素的引用和迭代器无效。其他 引用和迭代器不受影响。
由于j
和i
的指向位置不同,删除res.download
不会影响res.redirect({URL})
和循环。所以我很困惑为什么这是错误的。
环境:Windows10 x86,Visual Studio 2015 Update 3
答案 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并在链接中注明:
对已擦除元素的引用和迭代器无效。