首页 > 解决方案 > 递减 std::vector::begin 是否未定义,即使从未使用过?

问题描述

请注意,与关于该主题的许多问题相反(可能是为什么我在谷歌和 stackoverflow 上都找不到这个问题的令人满意的答案),我从不取消引用*(begin() - 1)


我的要求是:

我想出的是:

for (auto it = vector.end(); it-- != vector.begin(); ) {
    if (condition(*it)) {
        it = vector.erase(it);
    }
}

这似乎有效,因为it--返回迭代器的值,然后只递减它,这意味着迭代器总是在检查之后在进入循环体之前递减。

尤其是:

进入循环时

擦除元素时

vector.erase(it)返回向量中的下一个元素,因此在每次迭代时递减迭代器可以让我们只考虑向量中的每个元素。

退出循环时

在循环体的最后一次执行中,it == vector.begin(),所以下一次我们尝试循环条件:

也就是说,我的代码似乎确实计算了迭代器的位置begin() - 1,但从未访问它也没有将其用于比较或类似的事情。

这是未定义的行为吗?

我会冒段错误或其他风险吗?或者只是访问未初始化的数据?什么都没有,因为迭代器在被使用之前就被丢弃了?没有办法知道吗?

标签: c++iterator

解决方案


怎么样

for (auto it = vector.end(); it != vector.begin(); ) {
    --it;
    ... rest of the loop body

推荐阅读