首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从向量中检索两个最高值

从向量中检索两个最高值
EN

Stack Overflow用户
提问于 2013-02-23 10:38:08
回答 3查看 217关注 0票数 0

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

下面是我使用的代码:

代码语言:javascript
复制
 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;
    }

我的问题是,我只对一组数字中的最后两个值(两个最高值)感兴趣,但我真的无法理解它,我应该如何去实现我的目标。

在座的任何人对我的问题有什么建议或解决方案...?

问候

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-23 10:50:16

遍历列表,将每次的新值与旧的最高值进行比较。如果新值较高,则将其存储为最高值,并使用第二个变量来保持先前的最高值。

像这样的东西..可能在语法上不正确,但这里是:-

代码语言:javascript
复制
   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
EN

Stack Overflow用户

发布于 2013-02-23 10:56:47

您需要的是std::nth_element

代码语言:javascript
复制
    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;
    }
票数 1
EN

Stack Overflow用户

发布于 2013-02-23 12:03:40

这是@Rich上面提供的算法的一个不同版本,具有稍微少的比较(而不是测试每个值的最大值,然后是第二大值,通过颠倒顺序,可以减少预期的比较次数:如果一个数字小于第二大值,则只比较一次)。

代码语言:javascript
复制
int first = 0;
int second = 0;
for (auto const & v : list) {
   if (v > second) {
      second = v;
      if (second > first)
         std::swap(first,second);
   }
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15036392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档