2013-11-27 5 views
7

私はvector<data>(ここではdataは自分のペットタイプです)、その最大値を探したいと思います。C++ 11では、どのようにベクトルでstd :: maxを呼び出すことができますか?

C++ 11が表示さで標準std::max関数はオブジェクトのコレクションで動作するように、それはvectorのような、いないコレクションは最初の引数として初期化子リストを望んでいる:私は解決することができますどのように

vector<data> vd; 
std::max(vd); // Compilation error 
std::max({vd[0], vd[1], vd[2]}); // Works, but not ok since I don't vd.size() at compile time 

この ?

答えて

18

std::maxオーバーロードは、コンパイル時に判明している小さなセットにのみ適用されます。あなたが必要とするのはstd::max_elementです(これは11歳未満です)。ラムダとおそらく

auto max_iter = std::max_element(vd.begin(), vd.end()); 
// use *max_iter as maximum value (if vd wasn't empty, of course) 
1

より柔軟

vector<data> vd; 

auto it = max_element(vd.cbegin(), vd.cend(), [](const data& left, const data& right) 
    { 
    return (left < right); 
    }); 

あなたは自分のタイプに比較し、「データ」のオペレータを実装する必要があります。これは、コレクション(または任意のイテレータの範囲)の最大の要素にイテレータを返しますvia data::operator <()

+0

なぜ戻りませんか?left.some_data paceholder

+0

悪くない、上記のコードを修正します – angevad

関連する問題