2017-10-09 35 views
-1

を使用してカスタムデータのベクトルで最大値と最小値を見つける:は、私はこのようなデータ構造を持つアルゴリズム

struct Speed { 

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

vector<Speed> data; 

今、私はこのベクトルを描きたいです。素敵な軸を作成するには、このベクトルのデータの最大値と最小値を探したいと思います。私はこれが好きですが、それはsetにしか基づいていないので、いつでもactsetより小さいか大きい場合は失敗します。グラフの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? 
}); 

**私は結果を達成するためのアルゴリズムとラムダを含まない通常のコードの記述方法を**知っている...しかし、私はオペレーターを持たずにアルゴリズム/ラムダで行うことが可能であるかを確認するに興味があります構造体のオーバーロード。

私はactについても同じことをして、結果を比較することができます...しかし、それは私に4ループを要するでしょう!

+1

比較をどのように動作させたいのかはっきりしていませんか?あなたはセットと行動の最小/最大をしたいですか?平均?集合と行動の合計の最小/最大? 2つの値を比較する方法はたくさんあります。 – Jonesinator

+0

@Jonesinator私はちょうど両方の値の範囲をカバーするために私のチャートの最小値と最大値を取得したい –

+0

あなたは2つのプロパティ(set、act)の比較関数の作成について質問していますか? –

答えて

1

一般的に、わかりやすいコードをお勧めします。

したがって、それは(少なくとも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での1回のパスは実際には機能しません。各要素の比較は、ブール値を返す必要があります。trueは、左側が右側よりも小さく、falseは左側が右側より大きいか等しいことを意味します厳密な弱い順序が必要です)。ただし、ここでは、1つの要素は、他の要素よりも、およびよりも小さくなることがあります。シングルパスのminmax_elementを作成するための独自の関数を簡単に書くことができますが、2回のパスをせずに既存のSTL関数にうまく収まるとは思いません。

+0

OPが結果として望んでいるのであれば、各メンバーに 'std :: minmax_element'を使用し、その後、最終的な最小値と最大値を取得します。おそらく読みやすく、より効率的です。 – Phil1970

+0

https://onlinegdb.com/SJZCyXKhbにいくつかの変更がありますが、それは私が意味するものに近いですが、これが1つのループでしかできないといいのですが、 –

+0

私はループの1つのアプローチでは、ケース。たとえば、同じ項目が1つのフィールドの最小値と他のフィールドの最大値の両方である場合に機能します。 – Phil1970

関連する問題