我需要一个haskell的类似物 foldl 功能可折叠任何STL容器。预期签名就像以下:

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

标准STL没有这样的功能。做 促进 有什么?

我知道实施非常简单,但是我想知道是否有任何准备好的标准化实现。

还有一个问题:您通常如何在C ++/STL中折叠数据列表?

有帮助吗?

解决方案

STL确实具有这样的功能: std::accumulate. 。但是,它在标题中 <numeric>, , 不是 <algorithm>.

实际上 Wikipedia页面上的“折叠”页面 已经列出了 foldl/foldr 在包括C ++在内的大多数编程语言上发挥作用。

其他提示

你看过吗 std ::累积 在里面 <numeric> 标题?

这是我使用std ::累积的实现

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 也。

我以链接中的示例 肯尼特的答案, ,将所有这些翻译成 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