2013-02-23 31 views
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個最高值),但我真的不能避開我的頭它應該如何去實現我的目標。

任何人在這裏有一個建議或解決我的問題...?

問候

+3

在'greater'比較器中使用'partial_sort'將兩個最大值排序到前面。或者,只需遍歷列表並確定兩個最大的值。 – 2013-02-23 02:41:10

回答

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

     } 
+0

我真的很喜歡你的解決方案v.simple,並做什麼id假設。 Thx – Tomazi 2013-02-23 03:04:49

+2

這是不正確的,每個元素都需要與兩個最高值進行比較。例如,考慮向量中的第一個值是最高的,那麼只有第一個值纔會滿足'if'的條件,並且沒有元素會被選爲第二高的元素 – 2013-02-23 03:05:59

+0

@DavidRodríguez,你是對的,我會更新答案。感謝您指出了這一點。 – Rich 2013-02-23 03:08:40

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

這是一個不同版本的算法由@提供豐富的以上比較少的比較(而不是測試每個值的最大值,然後是第二大值,通過顛倒順序,預期的比較次數可以減少:如果一個數字小於第二大,它只會被比較一次)。

int first = 0; 
int second = 0; 
for (auto const & v : list) { 
    if (v > second) { 
     second = v; 
     if (second > first) 
     std::swap(first,second); 
    } 
} 

如果沒有已知值小於所有其他情況下,firstsecond值可與載體中的前兩個值進行初始化(按順序)。