在for循环中,条件中使用的变量是在每次迭代还是仅在第一次迭代时都被检查?

aNa*_*ame 2 c++ for-loop

我想在上运行循环std::vector<std::vector<int>> array以删除所需的元素。

我正在使用 for (i = 0; i < array.size(); i++)

array.erase()从循环内调用安全吗?

在我的脑海中,我假设for每次迭代都会检查array.size(),但也许它在启动时只执行一次。如果可以,for (i = 0; i < &array.size(); i++)那么将是一个很好的解决方案,不是吗?

谢谢。

tas*_*oor 5

从循环内调用array.erase()是否安全?

是的,这是绝对安全的。array.size()仅当编译器可以证明向量在循环内没有被修改时(例如,如果向量是常量且因此不可修改),才允许编译器通过仅在循环外调用一次来优化检查。在那种情况下,以这种方式进行优化不会改变可观察到的行为。但是由于您erase在循环内部进行调用,因此不允许编译器array.size()仅调用一次。

通常,实现只允许执行那些不会更改可观察行为的代码转换。这称为“假设规则”