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

时间:2015-08-26 18:49:35

标签: c++

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

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

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

这里发生了什么?

4 个答案:

答案 0 :(得分:5)

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

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

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

请参阅here - 查找size_type typedef - 它表示无符号类型。

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

答案 1 :(得分:3)

由于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 

答案 2 :(得分:2)

变量i将是无符号类型。

永远不会少于零。

最终你将访问向量之外的元素,因为我将回绕到最大可能的无符号值而不是去负数

答案 3 :(得分:1)

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