0

我已经声明了一个向量,它存储给定帧中所有边界框的区域。然后我使用从头到尾迭代的这个向量来检索值。然后我按升序(最低 -> 最高)对这些值进行排序。

这是我使用的代码:

 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 个最高值)感兴趣,但我无法真正理解它应该如何实现我的目标。

这里的任何人对我的问题有建议或解决方案......?

问候

4

3 回答 3

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;
                }  
            }

        }
于 2013-02-23T02:50:16.327 回答
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;
    }
于 2013-02-23T02:56:46.967 回答
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

于 2013-02-23T04:03:39.703 回答