作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有没有人写过一个符合 C++ STL 的算法,将 std::transform
和 std::accumulate
组合成一个支持一元、二进制和也许甚至(n-ary!)变体,比如 std::transformed_accumulate
?我想要这个是因为我发现这个模式在线性代数中高度可重用,例如 (l1-)norm 计算。 l1范数计算元素绝对值之和。
最佳答案
嗯...我敢打赌,您可以通过将转换嵌入二元谓词、转换元素并在转换后进行累加来做到这一点。
struct times2accumulator {
int operator()( int oldvalue, int newvalue ) const {
return oldvalue + 2*newvalue;
}
};
int r = std::accumulate( v.begin(), v.end(), 2, times2accumulator() );
那个仿函数相当于:
struct times2 {
int operator()( int x ) {
return 2*x;
}
};
std::vector<int> tmp; tmp.reserve( v.size() );
std::transform( v.begin(), v.end(), std::back_inserter(tmp), times2 );
int r = std::accumulate( tmp.begin(), tmp.end(), 0 );
当然这可以做成通用的,只需将转换仿函数传递给通用基仿函数:
template <typename Transform>
struct transform_accumulator_t {
Transform t;
transform_accumulator_t( Transform t ) : t(t) {}
int operator()( int oldvalue, int newvalue ) const {
return oldvalue + t(newvalue);
}
};
// syntactic sugar:
template <typename T>
transform_accumulator_t<T> transform_accumulator( T t ) {
return transform_accumulator_t<T>(t);
}
int r = std::accumulate(v.begin(), v.end(), 0, transform_accumulator(times2));
而且您还可以概括容器中的类型...或者甚至创建一个更通用的 transform_accumulator,它同时采用累加器和转换仿函数并按顺序应用它们。实际实现留给读者作为练习。
关于c++ - 转换和积累,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10592193/
我有一个应用程序不断从 TCP/IP 端点接收 XML 消息流。收到每条消息后,应用程序将其内容消化到一组核心数据实体中。这是通过三个上下文结构实现的: 大师(私有(private)队列) Main(
boost docs以此作为如何使用 boost::accumulate 的示例: // The data for which we wish to calculate statistical pro
我是一名优秀的程序员,十分优秀!