gpt4 book ai didi

c++ - 转换和积累

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:03 26 4
gpt4 key购买 nike

有没有人写过一个符合 C++ STL 的算法,将 std::transformstd::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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com