这是关于这个主题的第三个问题,我没有在评论中提出新问题,而是认为开始一个新主题会更好。
完整的代码可以在这里找到: C++ CvSeq Accessing arrays that are stored
使用以下代码,我可以显示已添加到RECT数组的最新向量(请注意,这是放在for循环中):
RECT& lastRect = detectBox->back();
std::cout << "Left: " << lastRect.left << std::endl;
std::cout << "Right: " << lastRect.right << std::endl;
std::cout << "Top: " << lastRect.top << std::endl;
std::cout << "Bottom: " << lastRect.bottom << std::endl;
我现在要做的是在for循环之外创建一个循环,它将显示 detectBox 中的所有向量。我无法确定数组中实际存在多少个向量,因此无法遍历向量。
我尝试使用以下内容:
int i = 0;
while ((*detectBox)[i].left!=NULL)
{
std::cout << "Left: " << (*detectBox)[i].left << std::endl;
std::cout << "Right: " << (*detectBox)[i].right << std::endl;
std::cout << "Top: " << (*detectBox)[i].top << std::endl;
std::cout << "Bottom: " << (*detectBox)[i].bottom << std::endl;
i++;
}
并且还试过玩 sizeof(* detectBox),但只返回 32 的答案......
答案 0 :(得分:1)
好的,你在这里使用了错误的术语。变量detectBox
是向量(或者更确切地说是指向它的向量的指针)。有三种方法可以迭代它(我稍后会再展示它们)。它不是一个数组,它不是一个向量数组。它是指向RECT
结构向量的指针。
现在关于如何迭代向量。就像你迭代任何向量一样。
第一种方法是使用C方式,使用索引:
for (unsigned i = 0; i < detectBox->size(); ++i)
{
RECT rect = detectBox->at(i);
std::cout << "Left: " << rect.left << std::endl;
...
}
第二种方式是使用迭代器的传统C ++方式:
for (std::vector<RECT>::iterator i = detectBox->begin();
i != detectBox->end();
++i)
{
std::cout << "Left: " << i->left << std::endl;
...
}
最后一种方法是使用C ++ 11标准中引入的range for循环:
for (RECT const& rect : *detectBox)
{
std::cout << "Left: " << rect.left << std::endl;
...
}
你尝试循环的条件(*detectBox)[i].left!=NULL
的问题是成员变量left
不是指针,当你越界时,你不能保证有一个& #34; NULL&#34;价值(相反,它将不确定并且看起来是随机的。)