gpt4 book ai didi

c++ - 在 `for` 循环内递增后,迭代器结束检查失败

转载 作者:太空狗 更新时间:2023-10-29 19:57:30 27 4
gpt4 key购买 nike

这个问题很可能是重复的,但我还没有找到关于这个问题的任何信息。

为什么递增放置在 vector 中最后位置的 iterator 会使它不等于 vector.end()

或者换句话说,为什么会正常执行:

int main() {
vector<string> vec = {"ve"};

for (auto it = vec.begin(); it != vec.end(); it++) {}

return 0;
}

当这个进入无限循环时:

int main() {
vector<string> vec = {"ve"};

for (auto it = vec.begin(); it != vec.end(); it++) { it++; }

return 0;
}

还有这个:

int main() {
vector<string> vec = {"ve"};

for (auto it = vec.begin(); it != vec.end(); it++) {
cout << (it == vec.end()) << " ";
cout << (*it == "ve") << endl;
it++;
}

return 0;
}

导致 SEGFAULT 打印:

0 1
0

所以,,实际上是递增的,所以它的内容变成空的(根据调试器,优化掉了),但它并没有变得等于 vec.end( )。为什么?

最佳答案

您正在检查 it != vec.end()但是用it++发生两次你在每张支票上跳过两次。换句话说,你跑过了 vector 的末尾。没有发现它。

如果您向 vector 中再添加一个元素,则循环将到达终点并停止,因为您将不再跳过终点(显然这不是“正确”的修复,它只是演示了问题)。

要修复它,请在循环增量之前检查结束。您也可以使用 operator< 检查在有条件的情况下,但这有点冒险,因为您要留下无效的 it一段时间,这对以后的代码维护不利。

关于c++ - 在 `for` 循环内递增后,迭代器结束检查失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33873276/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com