2017-10-09 92 views
-1

自定義數據的矢量我有一個數據結構是這樣的:查找最大和最小使用算法

struct Speed { 

     int set; //set by user 
     int act; //actual speed 
     int millis; //millis since epoch 
} 

vector<Speed> data; 

現在我要畫這個矢量。爲了創建一個很好的座標軸,我想在這個矢量中找到最大和最小的數據。我喜歡這個,但顯然,因爲它僅基於set,如果在任何一點act小於或大於set,它都會失敗。我的意思是圖表的Y軸應在最小值set, act和最大值set, act之間。

auto max = std::max_element(begin(data), end(data), 
          [&](const Speed& a, const Speed& b){ 
    return a.set() < b.set(); 
    //how about act? 
}); 

auto min = std::min_element(begin(data), end(data), 
          [&](const Speed& a, const Speed& b){ 
    return a.set() < b.set(); 
    //how about act? 
}); 

**我知道**怎麼寫不涉及算法和lambda表達式來實現結果的正常碼...但我很有興趣看看它是如何可能的算法/λ做,而無需操作員在結構中超載。

我也可以這樣做act然後比較結果...但是這會花費我4個循環!

+1

現在還不清楚你想如何比較行爲?你想要最小/最大的集合和行爲?平均?設置和行爲之和的最小/最大值?有很多方法可以比較兩個值。 – Jonesinator

+0

@Jonesinator我只想得到我的圖表的最小值和最大值,以涵蓋兩個值範圍 –

+0

您的關於爲兩個屬性(set,act)構造比較函數的問題? –

回答

1

一般來說,我會推薦大部分可讀代碼。

因此,它會是這樣的(假設至少一個項目):

auto set_minmax = std::minmax_element(begin(data), end(data), 
    [&](const Speed& a, const Speed& b) { return a.set < b.set; }); 

auto act_minmax = std::minmax_element(begin(data), end(data), 
    [&](const Speed& a, const Speed& b) { return a.act < b.act; }); 

auto min_act_set = std::min(*set_minmax.first, *act_minmax.first); 
auto max_act_set = std::max(*set_minmax.second, *act_minmax.second); 

但是,如果數據真的是大或邏輯比較複雜,我建議有一個積累的對象統計數據並對數據進行某種循環。

2

您可以在std::min_elementstd::max_element調用中使用std::minstd::max

#include <algorithm> 
#include <iostream> 
#include <vector> 

struct Speed { 
     int set; 
     int act; 
     int millis; 
}; 

int main() { 
    std::vector<Speed> data = { 
     {1, 2, 3}, 
     {4, 5, 6}, 
     {7, 8, 9} 
    }; 

    auto max_val = std::max_element(begin(data), end(data), 
            [](const Speed& a, const Speed& b){ 
     return std::max(a.set, a.act) < std::max(b.set, b.act); 
    }); 

    auto min_val = std::min_element(begin(data), end(data), 
            [](const Speed& a, const Speed& b){ 
     return std::min(a.set, a.act) < std::min(b.set, b.act); 
    }); 

    std::cout << "MAX: " << max_val->set << " " << max_val->act << "\n"; 
    std::cout << "MIN: " << min_val->set << " " << min_val->act << "\n"; 
} 

std::minmax一次通過不能真正在這裏工作。元素的每個比較必須返回布爾值,其中true表示左側小於右側,而false表示左側大於或等於右側(即a嚴格的弱排序是必需的)。然而,在這裏,單個元素可以比其他元素更小於。您可以輕鬆編寫自己的函數來創建單通minmax_element,但我認爲它不會很好地適用於現有的STL函數,而無需進行兩次通過。

+0

如果這是OP想要的結果,那麼我會爲每個成員使用'std :: minmax_element',然後得到最終的最小值和最大值。可能更容易閱讀和更高效。 – Phil1970

+0

https://onlinegdb.com/SJZCyXKhb發生了一些變化,它接近我的意思......但如果這隻能在一個循環中完成,將會很不錯 –

+0

我認爲單循環方法不能正確處理所有案例。例如,如果同一個項目既是一個字段的最小值又是另一個字段的最大值,它會起作用嗎? – Phil1970