C++ 删除std::multiset中的元素导致无关迭代器无效 #包括 std::多集; int main(){ s、 插入(1); s、 插入(2); s、 插入(3); 对于(自动i=s.rbegin();i!=s.rend();++i){ auto j=s.lower_bound(*i
迭代器无效的原因是循环将其擦除,而后续的C++ 删除std::multiset中的元素导致无关迭代器无效 #包括 std::多集; int main(){ s、 插入(1); s、 插入(2); s、 插入(3); 对于(自动i=s.rbegin();i!=s.rend();++i){ auto j=s.lower_bound(*i,c++,c++11,C++,C++11,迭代器无效的原因是循环将其擦除,而后续的for迭代在循环的增量部分使用该无效迭代器 如果使用调试器运行此操作,您将看到当调用erase()时,迭代器i指向与迭代器j相同的元素,并且i也将无效。在循环迭代中的++i上,尝试递增无效迭代器,从而导致错误 #include<set> std::multiset<int>s; int main() { s.insert(1); s.insert(2); s.insert(3); for (auto
for
迭代在循环的增量部分使用该无效迭代器
如果使用调试器运行此操作,您将看到当调用erase()
时,迭代器i
指向与迭代器j
相同的元素,并且i
也将无效。在循环迭代中的++i
上,尝试递增无效迭代器,从而导致错误
#include<set>
std::multiset<int>s;
int main() {
s.insert(1);
s.insert(2);
s.insert(3);
for (auto i=s.rbegin();i!=s.rend();++i) {
auto j=s.lower_bound(*i<<1);
if (j!=s.end())s.erase(j);
}
}
s.insert(1);
s、 插入(2);
s、 插入(3);
对于(自动i=s.rbegin();i!=s.rend();
++i) //尝试显式比较i!=j
,看看你关于它们的区别的推理是否正确。@Novelocrat:i.base()!=j
,因为他处理的是反向迭代器。@Novelocrat我在j!=s.end()中为*i
和*j
添加了输出
并且只按预期查看12
。这个问题可能很接近,可以将其作为一个复制品关闭。
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
}