26

foldlSTL コンテナーを折りたたむには、Haskell の関数の類似物が必要です。予想される署名は次のようになります。

template Iterator, FoldingFunction, Result
Result foldl(
  Iterator begin, 
  Iterator end, 
  FoldingFunction f, 
  Result initValue);

標準STLにはそのような機能はありません。ブーストにはありますか?

実装が非常に簡単であることはわかっていますが、すぐに標準化された実装があるかどうかを知りたいです。

もう 1 つ質問があります。通常、C++/STL でデータ リストをどのように折りたたむのですか?

4

5 に答える 5

43

STLには次のような機能がありますstd::accumulate。ただし、ヘッダー<numeric>にはありますが、ではありません<algorithm>

実際、「Fold」のWikipediaページには、C++を含むほとんどのプログラミング言語のfoldl/関数がすでにリストされています。foldr

于 2010-10-11T13:49:23.833 に答える
5

ヘッダーのstd::accumulateを見たことがありますか?<numeric>

于 2010-10-11T13:49:36.030 に答える
1

これが std::accumulate を使用した私の実装です

template<typename collection, typename operation>
typename collection::value_type reduce(collection col, operation op)
{
    return accumulate(col.begin(),  col.end(), typename collection::value_type(), op);
}

手段は reduce Haskell で折り畳まれます。そして、この関数テンプレートはプログラムをより機能的にするかもしれません:)

于 2015-01-07T18:28:34.637 に答える
0

std:: accumulate最有力候補に思えますが、古き良きものを使うことでも要件は達成できると思いますfor_each

KennyTMの回答のリンクから例を取り出し、それらすべてを に翻訳しましたfor_each完全なコードは codepadに掲載されています。一部を抜粋して以下に示します。

struct result_functor {
    result_functor( int initial, int multiplier ) :
        result_( initial ), multiplier_( multiplier ) {
    }
    int operator()( int x ) {
        result_ += multiplier_ * x;
        return result_;
    }
    int result_;
    int multiplier_;
};

const int init = 100;
const int numbers[] = { 10, 20, 30 };

const int accum_sum = std::accumulate( numbers, numbers + 3, init );
const result_functor for_sum = for_each( 
    numbers, numbers + 3, result_functor( init, +1 ) );
assert( accum_sum == for_sum.result_ );
于 2010-10-11T23:54:46.647 に答える