2017-06-08 8 views
0

通常、Javaストリームにはうってつけの問題がありますが、現在はC++ 11を使用しています。C++でフィルターをかけて折り畳む

私はJavaでこの問題を解決する方法は次のとおりです。

int solution = myList.stream() //myList is an arraylist of MyClass 
    .mapToInt(MyClass::GetInt) 
    .sum(); 

C++標準ライブラリの少しを探索した後、私は std::transformstd::accumulateが存在することを学びました。

私の唯一の問題はそれだけで私は私が蓄積する前に、V(整数)を入力するタイプTからマッピングするために必要な場所、Tを入力するタイプTからマッピングすることができるようstd::transformが思われることです。

理想的には、各ステップの中間結果を一時的な配列に格納するのではなく、このロジックを連鎖させることができます。

これを達成するための慣用的なC++ 11の方法はありますか?

+1

読みますもう一度 '蓄積する'ためのドキュメンテーション。そしてもう一度。 –

+1

"タイプTからタイプTにしかマップできないようです" - 本当ですか? –

答えて

0

std::transform他のタイプに変換することはできますが、ここでは必要ありません。 、あなたが投稿したJavaの例に非常に近い別の方法、

int solution = std::accumulate(
    begin(myList), end(myList), 0, 
    [](int v, const MyClass &c) { return v + c.GetInt(); } 
); 

Boost.Rangeライブラリを使用することです:あなたはこのように、カスタム操作でstd::accumulateを使用することができます

int solution = boost::accumulate(
    myList | boost::adaptors::transformed(boost::mem_fn(&MyClass::GetInt)), 
    0 
); 
+0

まさに私が探していたものです、ありがとう! – dustinroepsch

関連する問題