我已经声明了一个向量,它存储给定帧中所有Bounding Box的区域。然后,我从头到尾使用迭代此向量来检索值。然后我按升序对这些值进行排序(最低 - >最高)。
以下是我使用的代码:
double area = contourArea(boundingBoxArea);
list_area.push_back(area);
sort(list_area.begin(), list_area.end());
vector<double>::const_iterator area_iter;
int i = 0;
for(area_iter = list_area.begin(); area_iter != list_area.end(); area_iter++)
{
i++;
cout<<"Iterator " <<i<< " size is : " <<*area_iter<<endl;
}
我的问题是我只对这组数字中的最后两个值感兴趣(2个最高值),但我真的无法理解它应该如何实现我的目标。
这里的任何人都有我的问题的建议或解决方案......?
此致
答案 0 :(得分:1)
遍历列表,每次将新值与旧的最高值进行比较。如果新值更高,则将其存储为最高值,并具有保持先前最高值的第二个变量。
这样的东西..可能在语法上不正确,但在这里: -
int iCurrentHighest = 0;
int previousHighest = 0;
for(area_iter = list_area.begin(); area_iter != list_area.end(); area_iter++)
{
if(*area_iter>iCurrentHighest)
{
previousHighest = iCurrentHighest;
iCurrentHighest = *area_iter;
}
else
{
if ((*area_iter<iCurrentHighest) && (*area_iter>previousHighest))
{
previousHighest = *area_iter;
}
}
}
答案 1 :(得分:1)
您需要的是std::nth_element
double area = contourArea(boundingBoxArea);
list_area.push_back(area);
std::nth_element(list_area.begin(), list_area.begin() + 2, list_area.end(), std::greater<double>());
// first 2 elements in list_area are now 2 greatest
vector<double>::const_iterator area_iter;
int i = 0;
for(area_iter = list_area.begin(); area_iter != list_area.end(); area_iter++)
{
i++;
cout<<"Iterator " <<i<< " size is : " <<*area_iter<<endl;
}
答案 2 :(得分:1)
这是@Rich上面提供的算法的不同版本,稍微少一些比较(而不是通过反转顺序来测试每个值最大然后第二大,可以减少预期的比较次数:如果是数量小于仅比较一次的第二大数字)。
int first = 0;
int second = 0;
for (auto const & v : list) {
if (v > second) {
second = v;
if (second > first)
std::swap(first,second);
}
}
如果没有已知值小于所有其他值,则可以使用向量中的前两个值初始化first
和second
值(按顺序)。