题
我需要一个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);
}
不隶属于 StackOverflow