从向量中检索两个最高值

时间:2013-02-23 02:38:08

标签: c++ opencv

我已经声明了一个向量,它存储给定帧中所有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个最高值),但我真的无法理解它应该如何实现我的目标。

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

此致

3 个答案:

答案 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);
   }
}

如果没有已知值小于所有其他值,则可以使用向量中的前两个值初始化firstsecond值(按顺序)。