我声明了一个向量,它存储了给定帧中所有边界框的面积。然后我使用一个从头到尾迭代此向量的方法来检索值。然后我按升序对这些值进行排序(最低的->最高)。
下面是我使用的代码:
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;
}我的问题是,我只对一组数字中的最后两个值(两个最高值)感兴趣,但我真的无法理解它,我应该如何去实现我的目标。
在座的任何人对我的问题有什么建议或解决方案...?
问候
发布于 2013-02-23 10:50:16
遍历列表,将每次的新值与旧的最高值进行比较。如果新值较高,则将其存储为最高值,并使用第二个变量来保持先前的最高值。
像这样的东西..可能在语法上不正确,但这里是:-
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;
}
}
}发布于 2013-02-23 10:56:47
您需要的是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;
}发布于 2013-02-23 12:03:40
这是@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值。
https://stackoverflow.com/questions/15036392
复制相似问题