所以,我正在研究一个检测点坐标的项目。
我从std::vector<cv::Point> dots
中提取检测到的坐标,并将x和y坐标中的每一个存储到std::vector<int> dotsX
和std::vector<int> dotsY
。 (我知道我可以使用dots.x
或dots.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等)。
我不知道为什么会这样。
非常感谢任何帮助。 谢谢
答案 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)
这可能是一个错字。