3 回答
TA贡献1818条经验 获得超3个赞
如果通过valgrind运行程序,则会看到许多读取错误。换句话说,是的,迭代器是无效的,但是您在示例中很幸运(或者真的很不幸,因为您没有看到未定义行为的负面影响)。一种解决方案是创建一个临时迭代器,增加温度,删除目标迭代器,然后将目标设置为温度。例如,重新编写循环,如下所示:
std::set<int>::iterator it = numbers.begin();
std::set<int>::iterator tmp;
// iterate through the set and erase all even numbers
for ( ; it != numbers.end(); )
{
int n = *it;
if (n % 2 == 0)
{
tmp = it;
++tmp;
numbers.erase(it);
it = tmp;
}
else
{
++it;
}
}
TA贡献1895条经验 获得超3个赞
您误解了“不确定行为”的含义。未定义的行为并不表示“如果执行此操作,则程序将崩溃或产生意外的结果。” 这意味着“如果这样做,程序可能会崩溃或产生意外结果”,或执行其他任何操作,具体取决于您的编译器,操作系统,月相等。
如果某件事情执行时没有崩溃并且表现出预期的效果,则不能证明它不是未定义的行为。它所证明的是,在特定操作系统上使用特定编译器进行编译后,其行为恰好符合该特定运行所观察到的。
从集合中删除元素会使迭代器对已删除元素无效。使用无效的迭代器是未定义的行为。碰巧的是,观察到的行为正是您在此特定情况下想要的;这并不意味着该代码是正确的。
- 3 回答
- 0 关注
- 504 浏览
添加回答
举报