0

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

std::vector<cv::Point> dots我从x 和 y 坐标中提取检测到的坐标并将其存储到std::vector<int> dotsXstd::vector<int> dotsY中。(我知道我可以使用dots.xordots.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

4 回答 4

6

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

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

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

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

for (int x : dotsX) { std::cout << x << std::endl; }
于 2013-05-26T15:00:05.650 回答
1

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

你可以尝试这样的while循环,但是for循环更好地表达了这一点:

int x = 0;
while ( true ){
    if ( ! (x < dotsX.size() ) break;
    std::cout << dotsX[x] << std::endl;
    x++;
}
于 2013-05-26T15:10:44.657 回答
1

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

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

 while (x < dotsX.size())
于 2013-05-26T15:01:03.410 回答
0

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

x < dotsX.size()  

您的while循环正在检查值:

dotsX[x]  

表达式与以下while相同:

while (dotsX[x] != 0)

这可能是一个错字。

于 2013-05-26T17:29:42.553 回答