c++ - 转换和积累

标签 c++ algorithm stl transform accumulate

有没有人写过一个符合 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/

相关文章:

c++ - TTF_RenderText_Solid() 崩溃游戏和 Visual Studio [c++][sdl ttf]

java - 非英文字体编码

algorithm - 选择幂集的随机元素

c++ - 为什么 std::fstream 类不采用 std::string?

c++ - 有什么方法可以在不知道它的大小的情况下制作一个字符数组

c++ - libclang/libtooling 处理或关闭所有错误输出

algorithm - Runner 技术组合两个相等的链表

regex - 我怎样才能模式匹配类似于正则表达式的标记?

c++ - 从 vector 切换到双端队列的大小限制通常是多少?

c++ - MVP设计模式的STL实现