【发布时间】:2014-05-12 00:29:05
【问题描述】:
所以我在向量中搜索一个元素,将它存储在一个迭代器中,并在其上调用erase()。不幸的是,当我设置断点并检查发生了什么时,我看到即使closestObjectIt 指向正确的元素,该元素仍保留在向量中,其他一些元素被删除。我不知道这里出了什么问题;为什么不删除正确的迭代器?
我的项目中也有一些从 std::vector 到 cv::vector 的隐式转换(来自 OpenCV),反之亦然,但我出于怀疑将它们排除在外。
DetectedObject Head:: findTheClosestObjectFromObjects(std::vector<DetectedObject>& objects)
{
float minDistance = 10000;
std::vector<DetectedObject>::iterator closestObjectIt;
DetectedObject closestObject = objects[0];
for(std::vector<DetectedObject>::iterator it = objects.begin(); it != objects.end(); ++it)
{
float distance = computeDistance2((*it));
if (distance < minDistance)
{
minDistance = distance;
closestObject = (*it);
closestObjectIt = it;
}
}
std::cout << "Before erease: " << std::endl;
objects.erase(closestObjectIt);
std::cout << "After erease: " << std::endl;
return closestObject;
}
【问题讨论】:
-
试试 objects.erase(object.begin() + mostobjectIt)
-
如果您使用空向量调用它,则会出现未定义的行为,因为
objects[0]。除此之外,似乎还不错。尝试实际生成一些输出以确认怀疑;调试器信息可能会产生误导或错误。最好发布一个显示问题发生的最小但完整的程序。 -
由于您没有使用指针向量,因此值得检查
DetectedObject的复制赋值运算符。 -
使用
std::find_if而不是那个循环。 -
@MaximChetrusca 可能表明复制存在问题,正如 Matthew Finlay 所建议的那样 - 可能发布类定义,包括复制构造函数的主体和复制赋值运算符(如果有)
标签: c++ opencv stl std stdvector