質問
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);
}
所属していません StackOverflow