質問

Haskellのアナログが必要です foldl STLコンテナを折りたたむ機能。予想される署名は次のようなものです。

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

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

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

もう1つの質問:C ++/STLでデータリストをどのように折りたたむのですか?

役に立ちましたか?

解決

STLにはそのような機能があります: std::accumulate. 。ただし、ヘッダーにあります <numeric>, 、 いいえ <algorithm>.

実際に 「フォールド」のウィキペディアページ すでにリストされています foldl/foldr C ++を含むほとんどのプログラミング言語で機能します。

他のヒント

見たことがありますか std ::蓄積 の中に <numeric> ヘッダ?

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の折りたたみを意味します。そして、この関数テンプレートはプログラムをより機能的にする可能性があります:)

それでも 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_ );

なぜただそうしないのですか。

b_t foldl(b_t (*f)(b_t,a_t),b_t base_case,a_t * in_list){
 int l = sizeof(inList)/sizeof(a_t);
 b_t carry = base_case;
 for(int i = 0;i<l;i++){
   carry = f(carry,in_list[i]);
  }
 return carry;
}

または再帰的に; //多分あなたは正しい構文で私を助けることができます...

b_t foldl(b_t (*f)(b_t,a_t),b_t base_case,a_t * in_list){
 return foldl(f,f(base_case,in_list[0]),in_list + 1);      
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top