2017-11-14 4 views
4

タプルのベクトル内の要素の1つの最大値を見つけるための簡潔な方法があるかどうかは疑問でした。例えば次のように、タプルのベクトルでタプルの最大の第2の値を探したいとします。タプル要素の最大値を見つけるC++

vector<tuple<int, int>> foo = { {12,1},{12,5},{5,6} }; 

結果は、私が何かのようになりますこれを行うことができます6.

一つの方法として次のようになります。

vector<double> allFoo; 
for (int i = 0; i != size(foo); i++) { 
    allFoo.emplace_back(get<1>(foo[i])); 
} 
double maxVal = *max_element(allFoo.begin(), allFoo.end()); 

私は、しかし感じているあなたは、本質的に二回、この事を反復処理しているので、はるかに簡単に行うことができますか?カスタム述語と

私のタプルのスキルが少し限られていると、あなたがfooで直接max_elementのいくつかの種類を行うことができるはずのようにそれはそう...

+0

'tuple 'を 'array 'に置き換えるのはどうですか?また、 'find_if'を利用したいかもしれません。 – VTT

+4

適切な 'bool演算子<(const tuple &、const tuple &)'を持っていると仮定して '* max_element(begin(allFoo)、end(allFoo));もしあなたがそうでなければ、第3引数として比較関数(lambda)を 'max_element'に渡すことができます(おそらく演算子よりも綺麗です)。 – nwp

答えて

10

でカスタム比較演算子と1つのパス、:構造化されたバインディングと

std::vector<std::tuple<int, int>> foo = { {12,1},{12,5},{5,6} }; 

const auto less_by_second = [](const auto& lhs, const auto& rhs) 
    { return std::get<1>(lhs) < std::get<1>(rhs); }; 
const double maxVal = std::get<1>(*std::max_element(foo.begin(), foo.end(), less_by_second)); 
+0

答えに多くの感謝、これは私のコードでより速いです。 – ALs

7

使用max_element

auto maxVal = get<1>(*max_element(foo.begin(), foo.end(), 
         [](auto& l, auto& r) {return get<1>(l) < get<1>(r);})); 
0

バージョン:

std::vector<std::tuple<int, int>> tv = { {12, 1}, {13,2}, {11, 1} }; 

auto [max1, max2] = *max_element(begin(tv), end(tv), [](auto &lhs, auto &rhs) -> int {return std::get<1>(lhs) < std::get<1>(rhs); }); 

cout << max2 << endl; 
関連する問題