为什么我在“For”和“While”之间得到不同的结果?

时间:2013-05-26 14:58:56

标签: c++ vector

所以,我正在研究一个检测点坐标的项目。

我从std::vector<cv::Point> dots中提取检测到的坐标,并将x和y坐标中的每一个存储到std::vector<int> dotsXstd::vector<int> dotsY。 (我知道我可以使用dots.xdots.y,但这不是我想要的)

每当我想打印输出时,我会在for循环和while循环之间得到不同的结果来显示值向量。举个例子:

检测到的X坐标为15,20,50,检测到的Y坐标为2,10,20。

如果我使用for循环:

for(int x=0;x < dotsX.size();x++)
{
     std::cout << dotsX[x] << std::endl;
}

输出相同:15,20,50。

但是,如果我使用while循环:

int x=0;
while(dotsX[x])
{
    std::cout << dotsX[x] << std::endl;
    x++;
}

输出很奇怪:15,20,50,32。它总有一个额外的值(比如值32,有时是10201或4等)。

我不知道为什么会这样。

非常感谢任何帮助。 谢谢

4 个答案:

答案 0 :(得分:6)

第二个例子有未定义的行为,因为它总是最终访问dotsX的越界元素。

要使其与for循环相同,请将其更改为:

while(x < dots.size())
{
    // ...
}

另请注意,C ++有更多惯用的方法来迭代容器。特别是,C ++ 11具有基于范围的for循环,这使您无法使用索引或迭代器:

for (int x : dotsX) { std::cout << x << std::endl; }

答案 1 :(得分:1)

你的循环没有相同的条件。 while循环版本至少有一次访问超过向量的末尾。这样做会导致未定义的行为,并且可能发生任何事情。在你的情况下,看起来你只是得到一些额外的无效输出。

如果您更改条件以匹配您将获得匹配(正确)行为:

 while (x < dotsX.size())

答案 2 :(得分:1)

向量在内部保持大小,可以通过vector :: size()方法检索大小。因此,在循环中,只要x小于dotX.size(),就会增加x。你的前循环将在准备就绪时中止。 你不在while循环中检查x是否大于向量中的总cv :: Dot,因此你在while版本中获得的输出比在循环中的for版本更多。 while循环只会在偶然的dotX等于零时退出,但很可能你的程序会提前终止,因为你访问了你没有分配的内存。

你可以尝试像这样的while循环,但for循环表达得更好:

int x = 0;
while ( true ){
    if ( ! (x < dotsX.size() ) break;
    std::cout << dotsX[x] << std::endl;
    x++;
}

答案 3 :(得分:0)

您的for循环正在检查数量:

x < dotsX.size()  

您的while循环正在检查值:

dotsX[x]  

while表达式与:

相同
while (dotsX[x] != 0)

这可能是一个错字。