为什么我的for循环会在双打矢量上崩溃?

P45*_*ent 0 c++

这个for循环总是立即崩溃:

for (auto i = v.size() - 1; i >=0; --i);
Run Code Online (Sandbox Code Playgroud)

显然,我在循环中有一整堆代码,而v是双精度矢量.我试图以相反的顺序迭代它们.

这里发生了什么?

Rip*_*peR 5

for (auto i = v.size() - 1; i >=0; --i);
Run Code Online (Sandbox Code Playgroud)

看看vector :: size()方法 - 它通常返回unsigned int(在奇怪的平台上它可能是其他无符号类型)!所以你的i变量将具有无符号类型.

当你的循环进入步骤i == 0时它将减少它并且i将具有值2^32 - 1 == UNSIGNED_INT_MAX(或者如果你在奇怪的平台上工作则为其他正值 - 请参见平台上的vector :: size_type以查看基础类型).所以它永远不会小于0,它永远不会停止你的循环.我想当它变得如此之大,它崩溃因为它超出了范围,但我没有看到完整的代码确定.

看到这里 - 查找size_typetypedef - 它表示无符号类型.

您可能想要使用反向迭代器(请参阅@ NathanOliver的响应),尽管我不是很喜欢它们的简单循环.