为什么我的for循环在双精度向量上崩溃了

Why is my for loop crashing on a vector of doubles?

本文关键字:向量 崩溃 双精度 我的 for 循环 为什么      更新时间:2023-10-16

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

for (auto i = v.size() - 1; i >=0; --i);

显然我在循环中有一大堆代码,而v是一个双精度型的向量。我正试图以相反的顺序遍历它们。

这是怎么回事?

for (auto i = v.size() - 1; i >=0; --i);

看看vector::size()方法-它通常返回unsigned int(在奇怪的平台上可能是其他unsigned类型)!因此您的i变量将具有unsigned类型。

当你的循环将到达步骤i == 0时,它将递减它,i将具有值2^32 - 1 == UNSIGNED_INT_MAX(或其他正值,如果你在陌生的平台上工作-请参阅平台上的vector::size_type以查看底层类型)。所以它永远不会小于0,它永远不会停止循环。我猜当它变得如此之大时,它会崩溃,因为它超出了范围,但我没有看到完整的代码来确定。

看这里-查找size_type typedef -它说它的unsigned类型。

你可能想使用反向迭代器(参见@NathanOliver的回应),尽管我不太喜欢在简单的循环中使用它们。

由于i是无符号的,所以它永远不会小于0。它将绕行到它所能容纳的最大值。

如果你想对一个矢量进行反向迭代,那么你应该使用reverse_iterator

std::vector<int> foo = {1,2,3,4,5,6,7,8,9};
for (auto it = foo.rbegin(); it != foo.rend(); ++it)
    std::cout << *it << " ";

这将输出

9 8 7 6 5 4 3 2 1 

变量i将为unsigned类型

不可能小于0。

最终你将访问vector之外的元素,因为i将绕到最大可能的无符号值,而不是负

芭丝谢芭的话:auto类型是无符号的。因此,递减0变成一个大的正数,即>= 0,因此循环继续,但该值超出了向量的范围,并导致崩溃。