2016-03-25 6 views
0

vector<int> Aについては、*max_element(A.begin(), A.end())を使用してAの最大値を見つけることができます。しかし、私はループがforループを避けて、vector<vector<int>> Bの最大値を見つけるためのきれいな方法があるかどうかを知りたいですか?forループなしの<vector<int>ベクトルの最大値を見つける

int maxvalue = INT_MIN; 
for (int i = 0; i < m; i++) 
    for (int j = 0; j < n; j++) 
     maxvalue = max(maxvalue, B[i][j]); 

または

int maxvalue = INT_MIN; 
for (int i = 0; i < m; i++) 
{ 
    int temp = *max_element(B[i].begin(), B[i].end()); 
    maxvalue = max(maxvalue, temp); 
} 

しかし、私はまだそれが十分にきれいではない感じ:我々は forループを使用している場合

は、コードは次のように些細なことでした。そして私はforループが好きではありません。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 最後に、私はそれを行うには、次のコードを選択しました:代わりにあなたがstd::for_eachを使用することができforループの

auto itv = max_element(A.begin(), A.end(), [](vector<int>& a, vector<int>& b) 
     { return *max_element(a.begin(), a.end()) < *max_element(b.begin(), b.end()); }); 
int ans = *max_element(itv->begin(), itv->end()); 
+0

ループは素晴らしいです。それらをイテレータと組み合わせると、あなたは金です。 – Quirk

+0

@ c-wang:2つの 'ベクトル'の '* max_element()'を比較するカスタムコンパレータ関数を使ってみましたか? – Quirk

+0

いいえ、どうですか?コードのヒントを教えてください。 –

答えて

0

私は望ましい効果を得るためにmax_element()でカスタム比較演算子を使用していました。 max_element()が実行される暗黙の累積を除いて、ループはまったくありません。

bool mycomp(vector<int> a, vector<int> b) { 
    return *max_element(a.begin(), a.end()) < *max_element(b.begin(), b.end()); 
} 

vector<vector<int>> vv; // our vector of vectors 

auto itv = max_element(vv.begin(), vv.end(), mycomp); // find the vector 
                // with the max element 

int answer = *max_element((*itv).begin(), (*itv).end()); // finds the max element 
                 // in the desired vector 

これは決してクリーンです。しかしそれはそれが言うことをします。

+0

ラムダ関数を使って 'mycomp'を置き換えることは可能ですか? –

+0

コメントを参照して:http:// stackoverflow。com/questions/36228231/vector-vector-in-for-loop-for-for-loop/36228587#comment60087842_36228231 – Quirk

+0

@ c-wang:私は理由がないのは分かりません。 – Quirk

4
auto max_value = std::accumulate(std::begin(B), std::end(B), 
     std::numeric_limits<int>::min(), 
     [] (int cur_max, auto && vec) 
     { 
     return std::max(cur_max, *std::max_element(std::begin(v), std::end(v)); 
     }); 
0

。多分何か:

int maxvalue = std::numeric_limits<int>::min(); 
std::for_each(std::begin(B), std::end(B), [&maxvalue](const auto& v) 
{ 
    maxvalue = std::max(maxvalue, *std::max_element(std::begin(v), std::end(b))); 
}); 
0

あなたはループを使用しないようにしたい事は、あなたがループと一行で最大値を見つけることができますC++ 11を使用して、あなたのプログラムでは、長い構造体である場合は、次の

std::vector< std::vector<int> > w; 


int max = 0; 
for (auto i : w) for (auto j : i) max = j > max ? j : max; 

それとも

int max = 0; 
for (auto i : w) for (auto j : i) if (j > max) max = j; 

とにかく私はこれは良い習慣だとは思いません。このオプションは、より良いでしょう:

int max = 0; 
for (auto i : w) 
    for (auto j : i) 
     max = j > max ? j : max; 
+0

"forループなし" –

+0

真実なのは、クリーナーにするだけのことでしたが、私は答えを更新します – Ediolot

+0

C++ 11より前であっても、1行に入れることは価値がありません。 –

関連する問題